Aggiungi questo all'inizio dello script:
set -e
Ciò causerà l'uscita immediata della shell se un semplice comando termina con un valore di uscita diverso da zero. Un comando semplice è qualsiasi comando che non fa parte di un test if, while o until, o parte di un &&o || lista.
Vedi la pagina man di bash(1) sul comando interno "set" per maggiori dettagli.
Personalmente inizio quasi tutti gli script di shell con "set -e". È davvero fastidioso che uno script continui ostinatamente quando qualcosa fallisce nel mezzo e infrange i presupposti per il resto dello script.
Se hai bisogno di pulizia all'uscita, puoi anche usare 'trap' con lo pseudo-segnale ERR. Funziona allo stesso modo dell'intrappolamento di INT o di qualsiasi altro segnale; bash genera ERR se un comando termina con un valore diverso da zero:
# 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
Oppure, specialmente se stai usando "set -e", potresti intercettare EXIT; la tua trappola verrà quindi eseguita quando lo script termina per qualsiasi motivo, inclusa una fine normale, interruzioni, un'uscita causata dall'opzione -e, ecc.
Le istruzioni if nel tuo esempio non sono necessarie. Fallo in questo modo:
dosomething1 || exit 1
Se segui il consiglio di Ville Laurikari e usi set -e
allora per alcuni comandi potresti aver bisogno di usare questo:
dosomething || true
Il || true
farà in modo che la pipeline dei comandi abbia un true
restituisce il valore anche se il comando fallisce quindi il -e
l'opzione non ucciderà lo script.
Per aggiungere alla risposta accettata:
Tieni presente che set -e
a volte non basta, specialmente se hai le pipe.
Ad esempio, supponi di avere questo script
#!/bin/bash
set -e
./configure > configure.log
make
... che funziona come previsto:un errore in configure
interrompe l'esecuzione.
Domani farai un cambiamento apparentemente banale:
#!/bin/bash
set -e
./configure | tee configure.log
make
... e ora non funziona. Questo è spiegato qui e viene fornita una soluzione alternativa (solo Bash):
#!/bin/bash set -e set -o pipefail ./configure | tee configure.log make