Ich habe mich gefragt, wie ich den Exit-Status in einer if-Anweisung am besten überprüfen kann, um eine bestimmte Ausgabe wiederzugeben.
Ich denke daran
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, nur weil sie diesen Exit-Code haben muss. Außerdem weiß ich, dass ich etwas falsch mache, da der Exit das Programm offensichtlich beenden würde.
bash
shell
if-statement
error-handling
deadcell4
quelle
quelle
some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}
Antworten:
Jeder ausgeführte Befehl hat einen Exit-Status.
Bei dieser Überprüfung wird der Beendigungsstatus des Befehls überprüft, der zuletzt beendet wurde, bevor diese Zeile ausgeführt wird.
Wenn Sie möchten, dass Ihr Skript beendet wird, wenn dieser Test true zurückgibt (der vorherige Befehl ist fehlgeschlagen), setzen Sie
exit 1
(oder was auch immer)if
nach dem in diesen Blockecho
.Wenn Sie den Befehl ausführen und seine Ausgabe mit den folgenden Methoden testen möchten, ist dies häufig einfacher.
Oder zu drehen, der um den Einsatz
!
für die NegationBeachten Sie aber , dass keiner von diesen Sorgen , was der Fehlercode ist. Wenn Sie wissen, dass Sie sich nur um einen bestimmten Fehlercode kümmern, müssen Sie dies
$?
manuell überprüfen .quelle
a_command || return 1
return
funktioniert nur in einer Funktion und einem Sourcing-Skript. Sie benötigenexit
für den anderen Fall (der in einer Funktion und einem Sourcing-Skript zu viel bewirkt). Aber ja, das ist sicherlich ein vernünftiges Muster, wenn Sie keine spezielle Bereinigung oder zusätzliche Ausgabe benötigen.dash
die standardmäßige nicht interaktive Shell in vielen modernen Linux-Distributionen die Unterscheidung zwischenreturn
undexit
innerhalb von ausgeführten Shell-Skripten nicht berücksichtigt.dash
Beendet das Skript, auch wenn ichreturn
es verwende.if <command>
wenn der Exit-Code 0 ist. In jeder anderen Sprache wäre es umgekehrtif ! some_command | some_other_command
ignoriert den Status von some_command. Die zwei häufigsten Problemumgehungen für Befehle sind:set -o pipefail
(kann die Funktionalität in anderen Teilen Ihres Programms ändern) oder das Verschieben derif
Anweisungif [[ ${PIPESTATUS[0]} -ne 0 ]]
als separater Folgebefehl (hässlich, aber funktional). Wenn Sie verwenden,set -e
möchten Sie|| true
bei Verwendung der zweiten Lösung auch das Rohrende erweitern, da das Entfernen des Rohrs aus dem von angebotenen Kontrollflussif
andernfalls dazu führen würde, dass es sofort austritt.Beachten Sie, dass Exit-Codes! = 0 verwendet werden, um Fehler zu melden. Also ist es besser zu tun:
anstatt
quelle
dnf check-update
Gibt 0 (keine Updates), 100 (Updates verfügbar) oder 1 (Fehler) zurück.dnf
Entwickler diesen Weg gewählt haben, ist es ihre Wahl. Aber dennoch macht ihre Wahl nicht die Spezifikation gebrochen :)$?
ist ein Parameter wie jeder andere. Sie können den zu verwendenden Wert speichern, bevor Sie schließlich aufrufenexit
.quelle
Alternative zu explizit
if
AussageMinimal:
test $? -eq 0 || echo "something bad happened"
Komplett:
quelle
Nur um die hilfreiche und detaillierte Antwort zu ergänzen :
Wenn Sie den Exit-Code explizit überprüfen müssen, ist es besser, den arithmetischen Operator folgendermaßen zu verwenden
(( ... ))
:Oder verwenden Sie eine
case
Anweisung:Verwandte Antwort zur Fehlerbehandlung in Bash:
quelle