73 votes

Différence entre parenthèses et crochets dans les conditionnels Bash

En apprenant un peu plus sur bash j'en viens à voir quatre types de méthodes de travail avec les enfants. if déclarations :

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

Quelle est la différence entre les parenthèses et les crochets dans bash.

0 votes

0 votes

79voto

sputnick Points 31663

Les tests que vous avez énumérés :

  • Parenthèse simple - ( ... ) crée une sous-coquille
  • Parenthèse double - (( ... )) pour les opérations arithmétiques.
  • Le crochet simple - [ ... ] est la syntaxe de l'expression POSIX test
  • Double crochets - [[ ... ]] est la syntaxe des expressions conditionnelles en bash (similaire à test mais plus puissant)

ne sont pas exhaustives, vous pouvez utiliser logique booléenne

if command; then ...

aussi, car les commandes ont un statut de sortie. Dans bash , 0 es true et > 0 es 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

3 votes

$? n'est pas exactement la valeur de retour, il s'agit en fait de l'état de sortie ; 0 signifie le succès et 1 l'échec, que vous pouvez interpréter comme vrai et faux.

0 votes

J'ai remplacé "valeur de retour" par "statut de sortie", c'est vrai, mais l'échec n'est pas seulement 1 mais tous les statuts > 0 comme écrit dans mon post.

0 votes

Ex : curl /dev/null sortie avec 3

4voto

tripleee Points 28746

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X