Ajoutez ceci au début du script :
set -e
Cela entraînera la fermeture immédiate du shell si une commande simple se termine avec une valeur de sortie différente de zéro. Une commande simple est une commande qui ne fait pas partie d'un test if, while ou until, ou qui ne fait pas partie d'un &&ou || liste.
Voir la page de manuel bash(1) sur la commande interne "set" pour plus de détails.
Personnellement, je démarre presque tous les scripts shell avec "set -e". C'est vraiment ennuyeux d'avoir un script qui continue obstinément quand quelque chose échoue au milieu et brise les hypothèses pour le reste du script.
Si vous avez un nettoyage à faire à la sortie, vous pouvez également utiliser 'trap' avec le pseudo-signal ERR. Cela fonctionne de la même manière que le piégeage de INT ou de tout autre signal ; bash lance ERR si une commande sort avec une valeur différente de zéro :
# Create the trap with
# trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah
Ou, surtout si vous utilisez "set -e", vous pouvez intercepter EXIT ; votre trap sera alors exécuté lorsque le script se terminera pour une raison quelconque, y compris une fin normale, des interruptions, une sortie causée par l'option -e, etc.
Les instructions if de votre exemple sont inutiles. Faites comme ceci :
dosomething1 || exit 1
Si vous suivez les conseils de Ville Laurikari et utilisez set -e
alors pour certaines commandes, vous devrez peut-être utiliser ceci :
dosomething || true
Le || true
fera en sorte que le pipeline de commandes ait un true
renvoie la valeur même si la commande échoue donc le -e
l'option ne tuera pas le script.
Pour ajouter à la réponse acceptée :
Gardez à l'esprit que set -e
parfois ne suffit pas, surtout si vous avez des tuyaux.
Par exemple, supposons que vous ayez ce script
#!/bin/bash
set -e
./configure > configure.log
make
... qui fonctionne comme prévu :une erreur dans configure
interrompt l'exécution.
Demain, vous faites un changement apparemment trivial :
#!/bin/bash
set -e
./configure | tee configure.log
make
... et maintenant ça ne marche plus. Ceci est expliqué ici, et une solution de contournement (Bash uniquement) est fournie :
#!/bin/bash set -e set -o pipefail ./configure | tee configure.log make