La seule raison pour laquelle vous souhaitez utiliser $?
comme arguments d'une [
commande (que cette [
commande soit exécutée dans la partie condition d'une if
instruction ou non) est lorsque vous souhaitez discriminer sur un état de retour spécifique, comme:
until
cmd
[ "$?" -gt 1 ]
do
something
done
La syntaxe pour tous ceux if
, while
, until
... des déclarations est
if cmd-list1
then cmd-list2
else cmd-list3
fi
Qui s'exécute en cmd-list2
cas de cmd-list1
succès ou cmd-list3
non.
La [ "$?" -eq 0 ]
commande est un no-op. Il est défini $?
sur 0 si $?
est $?
égal à 0 et sur non nul s'il était différent de zéro.
Si vous voulez exécuter quelque chose en cas d' cmd
échec, c'est:
if ! cmd
then ...
fi
Généralement, vous n'avez pas besoin de bricoler et $?
encore moins de savoir quelle valeur signifie true
ou false
. Les seuls cas sont comme je l'ai dit ci-dessus si vous devez discriminer sur une valeur spécifique, ou si vous devez l'enregistrer pour plus tard (par exemple pour la retourner comme valeur de retour d'une fonction) comme:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
Souvenez-vous également que laisser une variable sans guillemets est l'opérateur split + glob. Cela n'a aucun sens d'invoquer cet opérateur ici, donc ça devrait être:
[ "$?" -ne 0 ]
pas [ $? -ne 0 ]
, et encore moins [$? -ne 0 ]
(qui n'appellerait la [
commande que s'il $IFS
contenait le premier caractère de $?
).
Notez également que la manière Bourne de définir une fonction est de rester function-name()
devant une commande. C'est le cas dans tous les shell Bourne like sauf bash
et yash
(et les versions récentes de posh
) qui n'autorisent qu'une commande composée (les commandes composées étant {...}
ou (...)
ou des choses comme for...done
, if...fi
...
function foo { ... }
est la ksh
syntaxe de définition de fonction. Il n'y a aucune raison pour que vous souhaitiez l'utiliser ici.
Votre code peut être écrit de manière portable (POSIX):
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Notez également que cd
sans -P
a une signification très spéciale (gère les chemins qui contiennent des ..
composants différemment de toute autre commande), il est donc préférable de l'inclure dans les scripts pour éviter les confusions.
(cette fonction renvoie en false
cas d' cd
échec, mais pas en cas d' <some command>
échec).
$?
est égal à 0 avec uneif
instruction est inutile,if
attend une commande et si cette commande revient0
, il exécute le code dans le bloc. ainsiif true; then echo hello; fi
fera écho bonjour depuis letrue
retour de la commande0
.