L'unico motivo per cui si desidera utilizzare $?
come argomenti un [
comando (indipendentemente dal fatto che quel [
comando venga eseguito nella parte condizione di if
un'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-list2
se ha cmd-list1
successo o cmd-list3
meno.
Il [ "$?" -eq 0 ]
comando è no-op. Imposta $?
su 0 se $?
è 0 e $?
su zero se era diverso da zero.
Se vuoi eseguire qualcosa se cmd
fallito, è:
if ! cmd
then ...
fi
In generale, non è necessario armeggiare con per $?
non parlare del valore true
o 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 $IFS
dovesse 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 bash
e 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 ksh
sintassi 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 cd
senza -P
ha 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 false
se cd
fallisce, ma non se <some command>
fallisce).
$?
è uguale a 0 conif
un'istruzione è inutile, siif
aspetta un comando e se detto comando ritorna0
, esegue il codice nel blocco. cosìif true; then echo hello; fi
farà eco ciao da quando il comando ètrue
tornato0
.