L'unico motivo per cui si desidera utilizzare $?come argomenti un [comando (indipendentemente dal fatto che quel [comando venga eseguito nella parte condizione di ifun'istruzione o meno) è quando si desidera discriminare uno stato di restituzione specifico, come:
until
cmd
[ "$?" -gt 1 ]
do
something
done
La sintassi per tutti coloro if, while, until... affermazioni è
if cmd-list1
then cmd-list2
else cmd-list3
fi
Che funziona cmd-list2se ha cmd-list1successo o cmd-list3meno.
Il [ "$?" -eq 0 ]comando è no-op. Imposta $?su 0 se $?è 0 e $?su zero se era diverso da zero.
Se vuoi eseguire qualcosa se cmdfallito, è:
if ! cmd
then ...
fi
In generale, non è necessario armeggiare con per $?non parlare del valore trueo false. Gli unici casi sono come ho detto sopra se è necessario discriminare un valore specifico o se è necessario salvarlo per dopo (ad esempio per restituirlo come valore di ritorno di una funzione) come:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
Ricorda inoltre che lasciare una variabile non quotata è l'operatore split + glob. Non ha senso invocare questo operatore qui, quindi dovrebbe essere:
[ "$?" -ne 0 ]
no [ $? -ne 0 ], figuriamoci [$? -ne 0 ](che invocherebbe il [comando solo se $IFSdovesse contenere il primo carattere di $?).
Si noti inoltre che il modo Bourne per definire una funzione è quello di rimanere function-name()davanti a un comando. Questo è il caso di ogni shell come Bourne tranne bashe yash(e versioni recenti di posh) che consentono solo un comando composto (comandi composti essendo {...}o (...)o cose del genere for...done, if...fi...
function foo { ... }è la kshsintassi della definizione della funzione. Non c'è motivo per cui vorresti usarlo qui.
Il tuo codice può essere scritto in modo portabile (POSIX):
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Si noti inoltre che cdsenza -Pha un significato molto speciale (gestisce percorsi che contengono ..componenti in modo diverso da qualsiasi altro comando), quindi è meglio includerlo negli script per evitare confusioni.
(quella funzione ritorna falsese cdfallisce, ma non se <some command>fallisce).
$?è uguale a 0 conifun'istruzione è inutile, siifaspetta un comando e se detto comando ritorna0, esegue il codice nel blocco. cosìif true; then echo hello; fifarà eco ciao da quando il comando ètruetornato0.