Bash: execute command2 se command1 falhar

43

Eu quero fazer algo assim:

if cmd1 && cmd2
echo success
else
echo epic fail
fi

Como devo fazer isso?

michelemarcon
fonte
11
Você está perdendo a palavra-chave "then" antes do comando "echo success".
Glenn Jackman
10
Hummm; seu pseudocódigo parece fazer uma pergunta diferente daquele em seu título .....
mattdm
Bom recurso para algumas condições shell script de saída pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Respostas:

71

Eles devem fazer o que você precisa:

cmd1 && cmd2 && echo success || echo epic fail

ou

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi
Petr Uzel
fonte
3
Isso funciona, mas estou confuso por ||que não olha para a saída do primeiro echocomando.
mlissner
11
@mlissner, o if else espera sair dos códigos, 0 se o comando foi iniciado e 1 se where erros. Não leia na saída. Just try whoami && whoami && echo success || echo epic faile agora whoami && whoareyou && echo success || echo epic fail. Eu não posso descobrir o que você quer dizer com "não olha para a saída do primeiro comando echo"
erm3nda
@mlissner Acho que recebi sua pergunta, mas a resposta é que o comando echo nunca falhará. Ou seja, seu retorno será 0, ou seja, verdade. Assim, a condição de que realmente importa é apenascmd1 && cmd2
Kazim Zaidi
22

Petr Uzel está no local, mas você também pode jogar com o $ $ mágico.

$? mantém o código de saída do último comando executado e, se você usar isso, poderá escrever seus scripts bastante flexíveis.

Esta pergunta aborda um pouco esse tópico, prática recomendada para usar $? na festança? .

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

Então você também pode reagir a diferentes códigos de saída e fazer coisas diferentes, se quiser.

Johan
fonte
11
Minha empresa, PHP Experts, Inc., e eu gostaria de agradecer por ser parte integrante de nosso script de IC interno. Obrigado!
Theodore R. Smith
7

O pseudocódigo na pergunta não corresponde ao título da pergunta.

Se alguém realmente precisar executar o comando 2 se o comando 1 falhar, esta é uma explicação simples:

  • cmd1 || cmd2: Isso será executado cmd1e, em caso de falha, será executadocmd2
  • cmd1 && cmd2: Isso será executado cmd1e, em caso de sucesso, será executadocmd2
  • cmd1 ; cmd2: Isso será executado cmd1e será executado cmd2, independentemente da falha ou sucesso da execução cmd1.
Orlando Rivera Letelier
fonte