Le shell lui-même ne fait qu'exécuter la commande et évaluer son code de sortie. Un code de sortie nul signifie un succès ; toutes les autres valeurs indiquent un échec.
if command; then
: things to do if the exit code from command was 0
else
: things to do if it was not 0
fi
while command; do
: things to do if the exit code was 0
done
La commande [
(alias test
) est très couramment utilisé dans les conditionnels, car le shell Bourne original ne disposait pas d'opérateurs intégrés pour vérifier si une chaîne était vide ou si un fichier existait. Les interpréteurs de commandes modernes intègrent cette commande, et de nombreux interpréteurs de commandes ont une version étendue et modernisée. [[
mais cela n'est pas correctement portable à POSIX. sh
et devrait donc être évité pour les scripts portables. Cette question connexe explique plus en détail les différences entre les deux.
La notation (( ... ))
introduit un contexte arithmétique. Encore une fois, c'est quelque chose qui ne faisait pas partie du shell Bourne original (il avait un outil externe dédié expr
pour ces choses) mais les coquilles modernes ont cette fonction intégrée. Le code de résultat d'une expression arithmétique est 0 si le résultat de l'évaluation arithmétique n'était pas 0 (ou une erreur).
La notation ( command )
crée un sous-shell et évalue command
en cela. Il existe des situations où cela est réellement nécessaire et utile, mais si vous venez juste d'apprendre la syntaxe, il est peu probable que vous en ayez besoin.
... En fait, dans la majorité des scripts où j'ai vu cet élément utilisé dans un conditionnel, il était clairement inutile.
Un autre anti-modèle à surveiller est le suivant
command
if [ $? = 0 ]; then
: things
fi
Vous ne devriez presque jamais avoir besoin d'examiner $?
explicitement, et en particulier, la comparer à zéro est quelque chose if
y while
spécifiquement font pour vous dans les coulisses. Ceci devrait simplement être refactorisé en
if command; then
: ...
0 votes
linuxquestions.org/questions/programming-9/
0 votes
stackoverflow.com/questions/3427872/