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 ifinstruction 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-list2cas de cmd-list1succès ou cmd-list3non.
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 trueou 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 $IFScontenait 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 bashet 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 kshsyntaxe 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 cdsans -Pa 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 falsecas d' cdéchec, mais pas en cas d' <some command>échec).
$?est égal à 0 avec uneifinstruction est inutile,ifattend une commande et si cette commande revient0, il exécute le code dans le bloc. ainsiif true; then echo hello; fifera écho bonjour depuis letrueretour de la commande0.