
Eu escrevi um script para executar alguns comandos do Linux e capturar as exceções em uma cláusula if e gerar os resultados. Basicamente, cada uma das variáveis no trecho do código abaixo representa o status de execução do comando e desejo sair do script com sucesso se todos os comandos forem executados com sucesso. Caso contrário, quero sair com um. Ao testar o script que fiz intencionalmente no comando falhar e a saída de uma variável, por exemplo, X8 é 1. Neste cenário, o abaixo não está funcionando conforme o esperado. Está me mostrando a mensagem de sucesso em vez da mensagem de falha no script. Não sei por que
if [ $X1 != 0 ] && [ $X2 != 0 ] && [ $X3 != 0 ] && [ $X4 != 0 ] && [ $X5 != 0 ] && [ $X6 != 0 ] && [ $X7 != 0 ] && [ $X8 != 0 ];
then echo "script failed"; exit 1;
else echo "success"; fi;
Responder1
No topo do seu script, adicione isto:
trap 'echo "Error $? at $LINENO; aborting." 1>&2; exit $?' ERR
Então, sempre que algo gerar um erro não detectado, o script irá retornar com a mensagem acima e sair com o código de saída do erro. Você pode mudar $?
para 1
se realmente quiser usar um código de saída 1 para qualquer erro.
Responder2
Primeiro de tudo, você está usando [
which é uma abreviação de test
. De man test
:
STRING1 != STRING2 the strings are not equal
Você está usando a ferramenta errada para o trabalho. O que você precisa é
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2
Segundo, você tem várias condições para testar aqui. Em vez de usar uma instrução if longa, tente somar a saída de cada variável, como Glenn sugeriu nos comentários, e teste isso. Alternativamente, avalie a saída de cada comando logo após ele existir. Não faz sentido executar outros, se você quiser sair porque esse comando será gerado de qualquer maneira.
Aqui está uma abordagem em loop:
for i in $X1 $X2 $X3 ;
do
[ $i -ne 0 ] && { echo "something failed"; exit 1; }
done
echo "Everything OK"
O truque aqui é que você está fazendo o mesmo teste para cada uma das variáveis, e se esse teste falhar, o script nunca chegará à parte "Tudo OK"