Der einzige Grund, warum Sie $?
als Argumente für einen [
Befehl verwenden möchten (unabhängig davon, ob dieser [
Befehl im Bedingungsteil einer if
Anweisung ausgeführt wird oder nicht), besteht darin, dass Sie einen bestimmten Rückgabestatus unterscheiden möchten, z.
until
cmd
[ "$?" -gt 1 ]
do
something
done
Die Syntax für alle diejenigen if
, while
, until
... Aussagen
if cmd-list1
then cmd-list2
else cmd-list3
fi
Welches läuft, cmd-list2
wenn cmd-list1
es erfolgreich ist oder cmd-list3
nicht.
Der [ "$?" -eq 0 ]
Befehl ist ein No-Op. Es wird $?
auf 0 gesetzt, wenn $?
0 ist, und $?
auf ungleich Null, wenn es nicht Null war.
Wenn Sie etwas ausführen möchten, wenn es cmd
fehlgeschlagen ist, ist es:
if ! cmd
then ...
fi
Im Allgemeinen müssen Sie nicht basteln, $?
geschweige denn wissen, welcher Wert bedeutet true
oder false
. Die einzigen Fälle sind, wie oben erwähnt, wenn Sie einen bestimmten Wert unterscheiden müssen oder wenn Sie ihn für später speichern müssen (um ihn beispielsweise als Rückgabewert einer Funktion zurückzugeben), wie:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
Denken Sie auch daran, dass der Operator split + glob eine Variable ohne Anführungszeichen bleibt. Es ist nicht sinnvoll, diesen Operator hier aufzurufen, daher sollte es sein:
[ "$?" -ne 0 ]
nicht [ $? -ne 0 ]
, geschweige denn [$? -ne 0 ]
(was den [
Befehl nur aufrufen würde, wenn $IFS
es das erste Zeichen von enthalten würde $?
).
Beachten Sie auch, dass die Bourne-Methode zum Definieren einer Funktion darin besteht, function-name()
vor einem Befehl zu bleiben . Das ist der Fall in jedem Bourne wie Shell außer bash
und yash
(und neueren Versionen von posh
) , die nur einer Verbindung Befehl (Verbindung Befehle zu sein erlauben {...}
oder (...)
oder Dinge wie for...done
, if...fi
...
function foo { ... }
ist die ksh
Syntax der Funktionsdefinition. Es gibt keinen Grund, warum Sie es hier verwenden möchten.
Ihr Code kann portabel (POSIXly) geschrieben werden:
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Beachten Sie auch, dass cd
without -P
eine ganz besondere Bedeutung hat (behandelt Pfade, die ..
Komponenten enthalten, die sich von anderen Befehlen unterscheiden). Daher ist es besser, sie in Skripte aufzunehmen, um Verwirrungen zu vermeiden.
(Diese Funktion wird zurückgegeben, false
wenn sie cd
fehlschlägt, aber nicht, wenn sie <some command>
fehlschlägt.)
$?
mit einerif
Anweisung gleich 0 ist, ist sinnlos,if
erwartet einen Befehl und wenn der Befehl zurückgegeben wird0
, wird der Code im Block ausgeführt. Alsoif true; then echo hello; fi
wird Hallo hallo, da der Befehltrue
zurückgegeben wurde0
.