Devo incorporar um comando em uma condicional ou testar seu código de retorno?

2

É uma simples questão de melhores práticas: qual devo usar?

Opção 1

ping -c1 "$host"

if [[ $? -eq 0 ]] ; then
   command
else
   command
fi

Opção 2

if ping -c1 "$host" ; then
   command
else
   command
fi

Eu sei que este é um comando simples, mas se crescer muito, a diferença pode ser significativa.

    
por jonatas.baldin 30.08.2014 / 23:13

3 respostas

5

É uma questão de preferência, mas o segundo formulário pode ser mais seguro se você pretende adicionar um set -e : este formulário ainda funcionará como esperado, enquanto no primeiro formulário, o script terminará imediatamente se ping falhar (retorna com um status de saída diferente de zero).

Nota: o operador é -eq , não eq .

    
por 30.08.2014 / 23:40
3

A opção 2 é apenas uma opção quando você se importa apenas com a diferença entre sucesso e falha. Se você precisar diferenciar entre diferentes status de saída diferentes de zero, a opção 1 será necessária.

some-command arg1 arg2
exit_status=$?
if [[ $exit_status -eq 0 ]]; then
   # ...
elif [[ $exit_status -eq 1 ]]; then
   # ...
elif [[ $exit status -eq 42 ]]; then
   # ...
else
   # ...
fi

(Você precisa salvar $? como exit_status porque $? será redefinido pelo primeiro comando [[ ... ]] ; se falhar, o primeiro elif não testaria o mesmo valor para $? novamente.)

Bem, não exatamente necessário . Uma terceira opção é usar uma instrução case , que pode eliminar a necessidade de salvar $? se você não precisar consultar seu valor novamente.

some-command arg1 arg2
case $? in
   0) # ...
   ;;
   1) # ...
   ;;
   42) # ...
   ;;
   *) # ...
   ;;
 esac
    
por 02.09.2014 / 02:26
1

Você pode usar o seguinte idioma do Bash que pode parecer ilegível, mas é bastante comum na prática.

ping -c1 "$host" && command_success || command_failure
    
por 31.08.2014 / 06:31