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.

565voto

Etan Reisner Punkte 73442

Jeder Befehl, der ausgeführt wird, hat einen Exit-Status.

Diese Prüfung betrachtet den Exit-Status des Befehls, der am meisten kürzlich vor der Ausführung dieser Zeile beendet wurde.

Wenn Sie möchten, dass Ihr Skript beendet wird, wenn dieser Test true zurückgibt (der vorherige Befehl fehlgeschlagen ist), dann geben Sie exit 1 (oder was auch immer) innerhalb dieses if-Blocks nach dem echo ein.

Aber, wenn Sie den Befehl ausführen und dessen Ausgabe testen möchten, ist die folgende Methode oft geradliniger.

if some_command; then
    echo Befehl hat true zurückgegeben
else
    echo Befehl hat einen Fehler zurückgegeben
fi

Oder um das umzukehren, verwenden Sie ! für die Negation

if ! some_command; then
    echo Befehl hat einen Fehler zurückgegeben
else
    echo Befehl hat true zurückgegeben
fi

Beachten Sie jedoch, dass keiner von beiden darauf achtet, was der Fehlercode ist. Wenn Sie wissen, dass Sie sich nur um einen bestimmten Fehlercode kümmern, müssen Sie $? manuell überprüfen.

433voto

Oo.oO Punkte 11029

Beachten Sie, dass Exit-Codes != 0 zur Meldung von Fehlern verwendet werden. Also ist es besser, das Folgende zu tun:

retVal=$?
if [ $retVal -ne 0 ]; then
    echo "Fehler"
fi
exit $retVal

anstatt

# schlägt bei Fehlercodes == 1 fehl
retVal=$?
if [ $retVal -eq 1 ]; then
    echo "Fehler"
fi
exit $retVal

99voto

Catskul Punkte 16549

Ein Alternativ für eine explizite if Anweisung

Minimal:

test $? -eq 0 || echo "Etwas Schlimmes ist passiert"

Vollständig:

EXITCODE=$?
test $EXITCODE -eq 0 && echo "Etwas Gutes ist passiert" || echo "Etwas Schlimmes ist passiert";
exit $EXITCODE

67voto

chepner Punkte 440093

$? ist ein Parameter wie jeder andere. Du kannst seinen Wert speichern, um ihn zu verwenden, bevor du letztendlich exit aufrufst.

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

56voto

dtk Punkte 1514

Zur Erinnerung, wenn das Skript mit set -e (oder #!/bin/bash -e) ausgeführt wird und daher nicht direkt $? überprüft werden kann (da das Skript bei einem Rückgabewert ungleich null beendet würde), aber einen bestimmten Code behandeln möchten, ist der Kommentar von @gboffis großartig:

/some/command || error_code=$?
if [ "${error_code}" -eq 2 ]; then
   ...

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