En apprenant un peu sur bash , j'en viens à voir quatre types de façons de travailler avec les instructions if
:
Quelle est la différence entre parenthèses et supports carrés en bash.
Les tests que vous aviez énumérés:
test
test
mais plus puissante)ne sont pas exhaustifs, vous pouvez utiliser la logique booléenne
if command; then ...
également, car les commandes ont un statut de sortie. Dans bash
, 0
est true
et> 0
est false
.
Vous pouvez voir l'état de sortie comme ceci:
command
echo $?
Voir:
--- (http://wiki.bash-hackers.org/syntax/basicgrammar
http://wiki.bash-hackers.org/syntax/arith_expr
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals
Le shell lui-même exécute uniquement la commande et évalue son code de sortie. Un code de sortie nul signifie le 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 conditions, car le Bourne Shell d'origine manquait d'opérateurs intégrés pour vérifier si une chaîne était vide ou si un fichier existait. Les shells modernes ont cette commande intégrée, et de nombreux shells ont une version étendue et modernisée [[
, mais ce n'est pas correctement portable sur POSIX sh
et doit donc être évité pour les scripts portables. Cette question connexe explique les différences entre les deux plus en détail.
La notation (( ... ))
introduit un contexte arithmétique. Encore une fois, c'était quelque chose qui ne faisait pas partie du Bourne Shell d'origine (il avait un outil externe dédié expr
pour ces choses) mais les shells modernes l'ont intégré. Le code de résultat d'une expression arithmétique est 0 si le 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 y a des situations où cela est réellement nécessaire et utile, mais si vous apprenez seulement la syntaxe, il est peu probable que vous en ayez besoin.
... En fait, dans la majorité des scripts, j'ai vu cela utilisé au conditionnel, c'était clairement inutile.
Un autre contre-modèle à surveiller est
command
if [ $? = 0 ]; then
: things
fi
Vous ne devriez presque jamais avoir besoin d'examiner $?
explicitement, et en particulier, le comparer à zéro est quelque chose que if
et while
spécifiquement font pour vous derrière les scènes. Cela devrait simplement être refactorisé pour
if command; then
: ...