613 Stimmen

Abbruch eines Shell-Skripts, wenn ein Befehl einen Wert ungleich Null zurückgibt

Ich habe ein Bash-Shell-Skript, das eine Reihe von Befehlen aufruft.

Ich möchte, dass das Shell-Skript automatisch mit einem Rückgabewert von 1 beendet wird, wenn einer der Befehle einen Wert ungleich Null zurückgibt.

Ist dies möglich, ohne das Ergebnis jedes Befehls explizit zu überprüfen?

Zum Beispiel,

dosomething1
if [[ $? -ne 0 ]]; then
    exit 1
fi

dosomething2
if [[ $? -ne 0 ]]; then
    exit 1
fi

15voto

lumpynose Punkte 917

Führen Sie es mit -e o set -e an der Spitze.

Siehe auch set -u .

10voto

ShaulF Punkte 711

Im Fehlerfall gibt das folgende Skript eine ROTE Fehlermeldung aus und beendet sich.
Fügen Sie dies an den Anfang Ihres Bash-Skripts:

# BASH error handling:
#   exit on command failure
set -e
#   keep track of the last executed command
trap 'LAST_COMMAND=$CURRENT_COMMAND; CURRENT_COMMAND=$BASH_COMMAND' DEBUG
#   on error: print the failed command
trap 'ERROR_CODE=$?; FAILED_COMMAND=$LAST_COMMAND; tput setaf 1; echo "ERROR: command \"$FAILED_COMMAND\" failed with exit code $ERROR_CODE"; put sgr0;' ERR INT TERM

6voto

Baligh Uddin Punkte 49
#!/bin/bash -e

sollte ausreichen.

4voto

gabor Punkte 1000

Ein Ausdruck wie

dosomething1 && dosomething2 && dosomething3

stoppt die Verarbeitung, wenn einer der Befehle mit einem Wert ungleich Null zurückkehrt. Zum Beispiel wird der folgende Befehl niemals "done" ausgeben:

cat nosuchfile && echo "done"
echo $?
1

-3voto

Malina Punkte 9

Ich füge nur eine weitere als Referenz hinzu, da es eine zusätzliche Frage zu Mark Edgars Beitrag gab, und hier ist ein weiteres Beispiel, das das Thema insgesamt berührt:

[[ `cmd` ]] && echo success_else_silence

Das ist dasselbe wie cmd || exit errcode wie jemand gezeigt hat.

Ich möchte zum Beispiel sicherstellen, dass eine Partition ausgehängt wird, wenn sie eingehängt ist:

[[ `mount | grep /dev/sda1` ]] && umount /dev/sda1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X