web-dev-qa-db-fra.com

Pourquoi utiliser des guillemets doubles dans un test [[]]?

Disons que nous avons 2 entiers dans un script bash:

value1=5
value2=3

Alors pourquoi avons-nous besoin d'utiliser des guillemets doubles en cas de test? Par exemple:

if [[ "$value1" -eq "$value2" ]]

Pourquoi ne pas simplement utiliser ce qui suit?

if [[ $value1 -eq $value2 ]]

Pour moi, les guillemets doubles n'ont aucun sens.

23
Meerkat

Fractionnement de mots.

Cet exemple est très improbable, mais possible, donc si vous voulez coder défensivement, couvrez vos pistes avec des guillemets:

$ set -x
$ value1=5
+ value1=5
$ value2=3
+ value2=3
$ [ $value1 -eq $value2 ]
+ '[' 5 -eq 3 ']'

OK, tout va bien jusqu'à présent. Jetons la clé dans les engrenages:

$ IFS=456
+ IFS=456
$ [ $value1 -eq $value2 ]
+ '[' '' -eq 3 ']'
bash: [: : integer expression expected

Oops.

$ [ "$value1" -eq "$value2" ]
+ '[' 5 -eq 3 ']'

Ahh.

7
glenn jackman

Vous n'avez pas vraiment besoin des devis ici. C'est l'un des très rares cas où il est sûr d'utiliser une variable sans guillemets. Vous pouvez le confirmer avec set -x:

$ var1=""
$ var2="3"
$ set -x
$ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
$ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!

Comme vous pouvez le voir ci-dessus, les versions citées et non citées du test sont résolues exactement de la même manière par bash. La même chose devrait être vraie pour zsh et, je pense, pour tout autre Shell prenant en charge [[ ]] opérateur.

Notez que ce n'est pas le cas avec le plus portable [ ]:

$ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi
+ '[' -eq 3 ']'
sh: [: -eq: unary operator expected
+ echo 'no match!'
no match!

Le [ ] construct, contrairement au [[ ]] un, nécessite un devis.


Quelques liens utiles pour en savoir plus sur le moment et les raisons de la citation:

35
terdon

Même si les guillemets doubles ne sont pas nécessaires, les raisons de les utiliser sont:

  • Bonne pratique/habitude: Dans ce cas, ils ne sont pas nécessaires, mais en général entre guillemets doubles sont pour éviter le fractionnement involontaire de Word.
  • Parce que value1 et value2 sont variables et vous ne savez peut-être pas ce qu'elles contiennent. Sinon, vous pourriez tout aussi bien demander: "Pourquoi s'embêter avec des variables au lieu de vérifier if [[ 5 -eq 3 ]]? Ou pour aller plus loin, pourquoi s'embêter avec le if quand vous savez déjà que 5 n'est pas égal à 3? Il vaut souvent mieux être défensif. (Il est vrai que le fractionnement de mots ne se produira pas dans [[, mais les cas où le fractionnement de mots se produit pas se produisent sont rares. Encore une fois, voir le premier point.)
16
jamesdlin

Tu as tout à fait raison!

La citation entre crochets doubles n'a aucun sens, du moins dans ce cas.

Mais comme j'utilise des guillemets tous les jours - en particulier pour les expressions simples entre crochets, en passant des arguments aux fonctions et aux scripts, ainsi que l'affectation des variables parfois (ce qui est complètement inutile pour les délocations simples) - je suppose que certaines personnes, à moins je le fais, écrivez des guillemets autour des extensions de variables instinctivement.

La citation double peut vous donner un sentiment de saveur. C'est comme rentrer à la maison où se trouvent les guillemets doubles. - D. Kummer

Un avantage de faire des guillemets doubles en conséquence et de manière compréhensible - mais seulement si cela a du sens - est que les collègues qui débutent en bash peuvent apprendre comment écrire des scripts plus stables. Il accentue également le fait que l'art du traitement des données avec bash concerne davantage la séparation des flux de données (y compris les variables) par des séparateurs de champs et des tuyaux les à travers des filtres. Dès que vous avez séparé vos morceaux de données du flux, tenez-les ensemble avec des guillemets!

Un autre avantage pourrait être la meilleure lisibilité des scripts bash avec des chaînes entre guillemets doubles dans un éditeur de mise en évidence de code.

1
Dominik Kummer

Pas directement lié à votre question, mais j'utilise

if (($ value1 == $ value2)); puis

quand je compare les chiffres, mais là aussi, vous n'avez pas à utiliser de guillemets.

1
framp