De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rafael Henrique da Silva Correia
Data de Publicação: 18 de junho de 2012
Olhando o script abaixo (sem escrevê-lo no Shell :P) o que você diria que ele escreve na tela?? Lembrando que a variável $? informa o retorno do status do último comando se o comando executou com sucesso ele será 0, se o comando deu algum erro ele será diferente de 0. Olhe:
#!/bin/bash echo "TESTANDO 123..." if [ "$?" -ne 0 ]; then echo "não igual a 0" elif [ "$?" -eq 0 ]; then echo "igual a 0" else echo "Nem um nem outro" fi
Se você achou (assim como eu achei) que ele escreveria na tela "não igual a 0" você está redondamente enganado! Descobri que cometi um erro deste tipo em um script que eu estava fazendo (com certeza muuuuito maior do que este).
Por que o script tem este comportamento?
A variável $?
como citado acima informa o retorno do status do último comando
se o comando executou com sucesso ele será 0, se o comando deu algum erro ele
será diferente de 0 .... porém o if
faz uso do comando test
(representado
por []), então o primeiro if
retornará um status e esse novo status será
armazenado dentro de $?
, desta forma DESGRAÇANDO todo o script.
E para corrigir?
Para corrigir basta criar uma variável auxiliar desta forma:
#!/bin/bash echo "TESTANDO 123..." VARAUX="$?" if [ "$VARAUX" -ne 0 ]; then echo "não igual a 0" elif [ "$VARAUX" -eq 0 ]; then echo "igual a 0" else echo "Nem um nem outro" fi
Eis que agora a saída do script será:
rafael@zion:~$ ./teste1.sh TESTANDO 123... igual a 0
Como depurar programas em shell?
Geralmente no caso deste problema eu faria o seguinte, escreveria echos para ver o conteúdo da variável $? durante a execução do script da seguinte maneira:
#!/bin/bash echo "TESTANDO 123..." echo "$?" if [ "$VARAUX" -ne 0 ]; then echo "$?" echo "não igual a 0" elif [ "$VARAUX" -eq 0 ]; then echo "$?" echo "igual a 0" else echo "$?" echo "Nem um nem outro" fi
E para finalizar existe um parâmetro muito bom do bash próprio para fins de depuração:
rafael@zion:~$ bash -x teste1.sh + echo 'TESTANDO 123...' TESTANDO 123... + echo 0 0 + '[' '' -ne 0 ']' teste1.sh: line 6: [: : esperado expressão de número inteiro + '[' '' -eq 0 ']' teste1.sh: line 11: [: : esperado expressão de número inteiro + echo 2 2 + echo 'Nem um nem outro' Nem um nem outro
Desta forma você conseguirá ver que rumo seu script está tomando!
Esta dica não é nada complexa, porém agradeço se alguém postar outras formas de depuração de scripts em shell, eu somente iniciei o assunto e aqui no Dicas-l já li muitos comentários legais e construtivos a respeito das dicas que eu já postei!
Conhecimento traz conhecimento! Vamos colaborar!
Até+
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários