Der einzige Grund, warum Sie $?als Argumente für einen [Befehl verwenden möchten (unabhängig davon, ob dieser [Befehl im Bedingungsteil einer ifAnweisung 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-list2wenn cmd-list1es erfolgreich ist oder cmd-list3nicht.
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 cmdfehlgeschlagen ist, ist es:
if ! cmd
then ...
fi
Im Allgemeinen müssen Sie nicht basteln, $?geschweige denn wissen, welcher Wert bedeutet trueoder 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 $IFSes 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 bashund 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 kshSyntax 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 cdwithout -Peine 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, falsewenn sie cdfehlschlägt, aber nicht, wenn sie <some command>fehlschlägt.)
$?mit einerifAnweisung gleich 0 ist, ist sinnlos,iferwartet einen Befehl und wenn der Befehl zurückgegeben wird0, wird der Code im Block ausgeführt. Alsoif true; then echo hello; fiwird Hallo hallo, da der Befehltruezurückgegeben wurde0.