você está aqui: Home  → Arquivo de Mensagens

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