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.

2voto

JonC Punkte 926

Dies könnte nur in einem begrenzten Satz von Anwendungsfällen nützlich sein. Ich benutze dies speziell, wenn ich den Output eines Befehls erfassen und in eine Protokolldatei schreiben muss, wenn der Exit-Code meldet, dass etwas schief gelaufen ist.

RESULT=$(mein_befehl_der_fehlschlagen_könnte)
if (exit $?) 
then
    echo "alles lief gut."
else
    echo "FEHLER: $RESULT" >> meine_logdatei.txt
fi

2voto

Abdull Punkte 24487

Dies ist eine Lösung, die set -euo pipefail elegant behandelt:

# ...

some-command && true
SOME_COMMAND_EXIT_STATUS="$?"

# ... 

Beispiel

#!/bin/bash
set -euo pipefail

# aufgrund von "set -e" wird die Konstruktion " ... && true" verwendet, um zu verhindern, dass das Skript sofort bei einem erwarteten nicht-null-Ausgangscode beendet wird.
# Gemäß dem Bash-Referenzhandbuch:
#
#   "[...] Die Shell wird nicht beendet, wenn der Befehl, der fehlschlägt,
#    [...] Teil eines Befehls ist, der in einer && oder || Liste ausgeführt wird
#    [solange es nicht der letzte Befehl in dieser Liste ist]"
#
# siehe https://www.gnu.org/software/bash/manual/html_node/Lists.html
# siehe "-e" unter https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

some-command && true
SOME_COMMAND_EXIT_STATUS="$?"

if [[ "$SOME_COMMAND_EXIT_STATUS" == 4 ]]; then
  echo "Ausgangsstatus von some-command war 4"
else
  echo "Ausgangsstatus von some-command war ungleich 4"
fi

1voto

Chen Tian Punkte 99

Unten sind Testskripte aufgeführt, die für

  • einfache Bash-Testbefehle
  • mehrere Testbefehle
  • Bash-Testbefehle mit Pipe enthalten:

    if [[ $(echo -en "abc\n def" |grep -e "^abc") && ! $(echo -en "abc\n def" |grep -e "^def") ]] ; then echo "Pipe true" else echo "Pipe false" fi if [[ $(echo -en "abc\n def" |grep -e "^abc") && $(echo -en "abc\n def" |grep -e "^def") ]] ; then echo "Pipe true" else echo "Pipe false" fi

Das Ergebnis ist:

Pipe true
Pipe false

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