
Este é um extrato do meu código:
ninja ()
{
if $1 = toto
then
return 1
elif $1 = tata
then
return 4
fi
}
main () {
ninja "tata"
if [ $? -ne 1 ]
then
somecode
fi
}
main "$@"
Sem motivo algum, quando minha função retorna algo, o programa simplesmente sai (testei com um trap EXIT), a função retorna 4 e executa o trap.
Editar: funciona quando eu comento
set -o errexit
set -o errtrace
Mas como posso encontrar o erro?
Responder1
Se você quiser testar aquele argumento de função equivalente a alguma string, você deve usar construct if [ "$x" == "string" ]
, então seu código ficará assim:
test () {
if [ "$1" == "toto" ] then
return 1
elif [ "$1" == "tata" ] then
return 4
fi
}
main () {
test "tata"
if [ $? -ne 1 ] then
echo "somecode"
fi
}
main "$@"
E você poderia usar test
o nome para a função. Se você quiser chamar builtin test
, use builtin test
construct.
E tome cuidado com =
(atribuição) e ==
(comparação). Dentro do teste [
e ]
do =
operador funciona como ==
e testa a igualdade de strings (não números).
set -o errexit
sai imediatamente após o comando retornar diferente de zero (sem sucesso). Seus ninja
retornos 1
(que são diferentes de zero) e saída.
Seu código sem testes não está funcionando porque if
a instrução tenta executar instruções nele e determinar o estado de saída do comando: se o estado de saída for zero (sucesso), execute as instruções após then
até elif
de fi
.