623 Stimmen

Wie man den Exit-Status mithilfe einer 'if'-Anweisung überprüft

Was wäre der beste Weg, den Exit-Status in einem if-Anweisung zu überprüfen, um eine bestimmte Ausgabe auszugeben?

Ich denke, es wäre:

if [ $? -eq 1 ]; then
    echo "blah blah blah"
fi

Das Problem, das ich auch habe, ist, dass die exit-Anweisung vor der if-Anweisung steht, einfach weil sie diesen Exit-Code haben muss. Außerdem weiß ich, dass ich etwas falsch mache, da der Exit natürlich das Programm beenden würde.

37voto

codeforester Punkte 33470

Nur um der hilfreichen und ausführlichen Antwort hinzuzufügen:

Wenn Sie den Exit-Code explizit überprüfen müssen, ist es besser, den arithmetischen Operator (( ... )) auf diese Weise zu verwenden:

run_some_command
(($? != 0)) && { printf '%s\n' "Befehl wurde mit einem anderen Wert als Null beendet"; exit 1; }

Oder verwenden Sie eine case-Anweisung:

run_some_command; ec=$?  # speichern Sie den Exit-Code in einer Variablen, damit er später wiederverwendet werden kann, ohne die Gefahr, überschrieben zu werden
case $ec in
    0) ;;
    1) printf '%s\n' "Befehl wurde mit einem anderen Wert als Null beendet"; exit 1;;
    *) etwas_anderes_tun;;
esac

Verwandte Antwort zum Fehlerhandling in Bash:

19voto

Nishant Punkte 18752

Wenn Sie eine Funktion schreiben - was immer bevorzugt wird - können Sie den Fehler so weitergeben:

Funktion()
{
    if ; dann
        echo hat geklappt
    else
        zurückgeben
    fi
}

Jetzt kann der Aufrufer Dinge wie Funktion && nächste wie erwartet ausführen! Das ist nützlich, wenn Sie viele Dinge im if Block zu tun haben, etc. (ansonsten gibt es Einzeiler dafür). Es kann leicht mit dem false Befehl getestet werden.

16voto

ivanko337 Punkte 303

Sie können dieses if-Statement einfach hinzufügen:

if [ $? -ne 0 ];
then
    echo 'Der vorherige Befehl wurde nicht erfolgreich ausgeführt';
fi

12voto

Aviel Yosef Punkte 514

Mit Z shell (zsh) können Sie einfach verwenden:

if [[ $(false)? -eq 1 ]]; then echo "yes" ;fi

Wenn Sie Bash verwenden und set -e aktiviert ist, können Sie verwenden:

false || exit_code=$?
if [[ ${exit_code} -ne 0 ]]; then echo ${exit_code}; fi

4voto

Colin 't Hart Punkte 6710

Ich vermisse die einfachste Lösung, die darin besteht, den &&-Operator zu verwenden:

Befehl -- mit Parametern && echo "Befehl erfolgreich abgeschlossen"

- vorausgesetzt, dass Befehl im Erfolgsfall 0 zurückgibt und im Fehlerfall eine andere Zahl als von Bash erwartet (was irgendwie das Gegenteil vieler Programmiersprachen ist!)

Der ||-Operator kann für Fehler verwendet werden:

Befehl -- mit Parametern || echo "Befehl fehlgeschlagen"

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