Agregue esto al comienzo del script:
set -e
Esto hará que el shell se cierre inmediatamente si un comando simple sale con un valor de salida distinto de cero. Un comando simple es cualquier comando que no forma parte de un if, while o before test, ni forma parte de un &&o || lista.
Consulte la página man de bash(1) sobre el comando interno "set" para obtener más detalles.
Personalmente, comienzo casi todos los scripts de shell con "set -e". Es realmente molesto tener un guión que continúa obstinadamente cuando algo falla en el medio y rompe las suposiciones para el resto del guión.
Si tiene que hacer una limpieza al salir, también puede usar 'trampa' con la pseudo-señal ERR. Esto funciona de la misma manera que atrapar INT o cualquier otra señal; bash arroja ERR si algún comando sale con un valor distinto de cero:
# 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
O, especialmente si está usando "set -e", podría interceptar EXIT; su trampa se ejecutará cuando el script salga por cualquier motivo, incluido un final normal, interrupciones, una salida causada por la opción -e, etc.
Las declaraciones if en su ejemplo son innecesarias. Solo hazlo así:
dosomething1 || exit 1
Si sigues el consejo de Ville Laurikari y usas set -e
entonces, para algunos comandos, es posible que necesite usar esto:
dosomething || true
El || true
hará que la canalización de comandos tenga un true
devuelve el valor incluso si el comando falla, por lo que el -e
La opción no eliminará el script.
Para agregar a la respuesta aceptada:
Tenga en cuenta que set -e
a veces no es suficiente, especialmente si tienes tuberías.
Por ejemplo, suponga que tiene este script
#!/bin/bash
set -e
./configure > configure.log
make
... que funciona como se esperaba:un error en configure
cancela la ejecución.
Mañana haces un cambio aparentemente trivial:
#!/bin/bash
set -e
./configure | tee configure.log
make
... y ahora no funciona. Esto se explica aquí y se proporciona una solución alternativa (solo Bash):
#!/bin/bash set -e set -o pipefail ./configure | tee configure.log make