Wie kann ich so etwas in bash machen?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
bash
control-flow
Michael Mrozek
quelle
quelle
then
eine separate Zeile einfügen.if ! command ; then ... ; fi
.[
ist selbst ein Befehl und wird in diesem Fall nicht benötigt.if [ ! command ]
führt nicht auscommand
; Es wirdcommand
als Zeichenfolge und als wahr behandelt, da es eine Länge ungleich Null hat.[
ist ein Synonym für dentest
BefehlFür kleine Dinge, die passieren sollen, wenn ein Shell-Befehl funktioniert, können Sie das
&&
Konstrukt verwenden:Ebenso können Sie für kleine Dinge, die passieren sollen, wenn ein Shell-Befehl fehlschlägt, Folgendes verwenden
||
:Oder beides
Es ist wahrscheinlich unklug, sehr viel mit diesen Konstrukten zu tun, aber sie können gelegentlich den Kontrollfluss viel klarer machen.
quelle
Überprüfen Sie den Wert von
$?
, der das Ergebnis der Ausführung des letzten Befehls / der letzten Funktion enthält:quelle
if
Redewendung nicht verwendet. Ich bevorzuge die Antwort von Keith Thompson.if
ist, dies zu tun. Die Bedingungen für die Flusskontrolle in Bash werden alle$?
hinter den Kulissen untersucht. das ist was sie tun. Eine explizite Prüfung des Wertes sollte in den allermeisten Fällen nicht erforderlich sein und ist normalerweise ein Anfänger-Antimuster.if ! cmd
ist , ist das in Ordnung. Ansonsten ist es üblich, eineelse
Klausel zu verwenden. Du kannst kein leeres haben,then
aber du siehst manchmal,then : nothing; else
wo das:
No-Op von Bedeutung ist.true
würde dort auch funktionieren.Das hat bei mir funktioniert:
Wenn dies
command
erfolgreich ist,echo "OK"
wird es ausgeführt, und da es erfolgreich ist, wird die Ausführung dort gestoppt. Andernfalls&&
wird übersprungen undecho "NOK"
ausgeführt.quelle
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
?echo "OK"
Teil selbst ausfallen könnte, dann ist dies besser:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Es sollte beachtet werden, dass
if...then...fi
und&&
/ oder der||
Typ des Ansatzes den Exit-Status behandelt, der von dem Befehl zurückgegeben wird, den wir testen möchten (0 bei Erfolg); Einige Befehle geben jedoch keinen Exit-Status ungleich Null zurück, wenn der Befehl fehlgeschlagen ist oder Eingaben nicht verarbeiten konnte. Dies bedeutet, dass die üblichenif
und&&
/||
Ansätze für diese bestimmten Befehle nicht funktionieren.Unter Linux wird GNU beispielsweise
file
immer noch mit 0 beendet, wenn eine nicht vorhandene Datei als Argument empfangen wurde undfind
der angegebene Benutzer die Datei nicht finden konnte.In solchen Fällen besteht eine mögliche Möglichkeit, mit der Situation umzugehen, darin,
stderr
/stdin
messages zu lesen , z. B. diejenigen, die perfile
Befehl zurückgegeben werden, oder die Ausgabe des Befehls wie in zu analysierenfind
. Zu diesem Zweckcase
könnte die Anweisung verwendet werden.quelle
Das fehleranfälligste, das ich finden konnte, war:
RR=$?
Betrachten Sie nun nicht nur diese Situation, sondern auch andere, denen Sie möglicherweise gegenüberstehen:
definierte Variable:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Antwort: ja
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Antwort: nein
undefinierte Variable:
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Antwort: nein
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Antwort: ja
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Antwort: ja
Dies verhindert alle Arten von Fehlern.
Sie kennen wahrscheinlich die gesamte Syntax, aber hier einige Tipps:
"blank"
zu seinnothing
.${variable}
.base-8
. Sie erhalten eine Fehlermeldung wie:value too great for base (error token is "08")
für Zahlen oben7
. Dann10#
kommt ins Spiel:10#
zwingt die Nummer zu seinbase-10
.quelle
Du kannst das:
quelle
ping
wird erfasst, um es als Befehl auszuführen . Da die Ausgabe jedoch nach / dev / null umgeleitet wird, ist dies immer die leere Zeichenfolge. Sie führen also nichts in einer Subshell aus, was bedeutet, dass der vorherige Exit-Status (der Ping-Subshell für die Befehlsersetzung) beibehalten wird. Offensichtlich ist der richtige Wegif ping ...; then
hier.Wie an anderer Stelle in diesem Thread erwähnt, beantwortet sich die ursprüngliche Frage im Wesentlichen von selbst. Die folgende Abbildung zeigt, dass
if
Bedingungen auch verschachtelt sein können.In diesem Beispiel wird
if
überprüft, ob eine Datei vorhanden ist und ob es sich um eine reguläre Datei handelt. Wenn diese Bedingungen zutreffen, prüfen Sie, ob die Größe größer als 0 ist.quelle
quelle
Dies könnte einfach auf diese Weise geschehen, da
$?
Sie den Status des zuletzt ausgeführten Befehls erhalten.So könnte es sein
quelle