você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

Problemas IDIOTAMENTE comuns quando se cria um script em Shell

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é+



Veja a relação completa dos artigos de Rafael Henrique da Silva Correia