web-dev-qa-db-fra.com

Différence de Bash entre les instructions IF avec parenthèses et crochets

En apprenant un peu sur bash , j'en viens à voir quatre types de façons de travailler avec les instructions if:

  • Parenthèse simple - (...)
  • Parenthèse double - ((...))
  • Support carré simple - [...]
  • Supports carrés doubles - [[...]]

Quelle est la différence entre parenthèses et supports carrés en bash.

57
Luis Alvarado
64
Gilles Quenot

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
    : ...
2
tripleee