Bash: exécutez commande2 si commande1 échoue

43

Je veux faire quelque chose comme ça:

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

Comment devrais-je le faire?

michelemarcon
la source
1
Il vous manque juste le mot-clé "then" avant la commande "echo success".
Glenn Jackman
10
Hmmm; votre pseudocode semble poser une question différente de celle de votre titre .....
mardi
Bonne ressource pour certaines conditions de sortie des scripts de shell pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Réponses:

71

Ceux-ci devraient faire ce dont vous avez besoin:

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

ou

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi
Petr Uzel
la source
3
Cela fonctionne, mais je suis confus, pourquoi ||ne regarde pas la sortie de la première echocommande.
mlissner
1
@mlissner, le if else s'attend à sortir des codes, 0 si la commande est lancée et 1 si les erreurs. Ne pas lire à la sortie. Just try whoami && whoami && echo success || echo epic failet maintenant whoami && whoareyou && echo success || echo epic fail. Je n'arrive pas à comprendre ce que vous entendez par "ne regarde pas le résultat de la première commande d'écho"
m3nda
@ mlissner Je pense avoir compris votre question, mais la réponse est que la commande echo n'échouera jamais. C'est-à-dire que son retour sera 0, c'est-à-dire la vérité. Donc, la condition qui compte vraiment est justecmd1 && cmd2
Kazim Zaidi
22

Petr Uzel est sur place, mais vous pouvez également jouer avec la magie $ ?.

$? contient le code de sortie de la dernière commande exécutée, et si vous l'utilisez, vous pouvez écrire vos scripts avec une grande flexibilité.

Cette question touche un peu ce sujet. Meilleure pratique pour utiliser $? en bash? .

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

Ensuite, vous pouvez également réagir à différents codes de sortie et faire différentes choses si vous le souhaitez.

Johan
la source
1
Mon entreprise, PHP Experts, Inc., et moi-même tenons à vous remercier d’avoir fait partie intégrante de notre script interne CI. Merci!
Theodore R. Smith Le
7

Le pseudo-code de la question ne correspond pas au titre de la question.

Si quelqu'un a réellement besoin de savoir comment exécuter la commande 2 si la commande 1 échoue, voici une explication simple:

  • cmd1 || cmd2: Cela fonctionnera cmd1et en cas d'écheccmd2
  • cmd1 && cmd2: Cela fonctionnera cmd1, et en cas de succès, cela fonctionneracmd2
  • cmd1 ; cmd2: Ceci s'exécutera cmd1, et ensuite cmd2, indépendamment de l'échec ou du succès de l'exécution cmd1.
Orlando Rivera Letelier
la source