shell script se a condição não funcionar conforme o esperado

shell script se a condição não funcionar conforme o esperado

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 1se 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"

informação relacionada