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.
5
et3
, est la maintenabilité. Les valeurs peuvent changer ultérieurement et les erreurs résultantes peuvent ne pas être évidentes.[[ ]]
, seulement pour[ ]
.[[ ]]
elles contraignent également les opérandes de-eq
en entiers.Réponses:
Fractionnement de mots.
Cet exemple est très improbable, mais possible , donc si vous voulez coder défensivement, couvrez vos pistes avec des guillemets:
OK, tout va bien jusqu'à présent. Jetons la clé dans les engrenages:
Oops.
Ahh.
la source
[[ ]]
construction de bash .[ $value1 -eq $value2 ]
avec un videvalue1
serait sans'[' -eq 3 ']'
avec''
sur le côté gauche.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
:Comme vous pouvez le voir ci-dessus, les versions cotées et non coté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, tout autre shell qui prend en charge l'[[ ]]
opérateur.Notez que ce n'est pas le cas avec les plus portables
[ ]
:La
[ ]
construction, contrairement à[[ ]]
celle, nécessite une citation.Quelques liens utiles pour en savoir plus sur le moment et les raisons de la citation:
la source
declare -i var1=
est0
lorsqu'il est évalué.-eq
c'est une comparaison arithmétique , vous pouvez même laisser de$
côté (in[[ .. ]]
) et écrire[[ a -eq b ]]
. Avec la comparaison de chaînes, vous avez besoin du$
, bien sûr, donc[[ $a = $b ]]
var1="afoob"; var2="a*b"; [[ $var1 = $var2 ]] && echo match
. Si vous souhaitez utiliser les caractères glob sans qu'ils agissent comme un glob dans un contexte de globbing (comme le[[ ]]
), alors vous devez citer, oui.((...))
ou$((...)
. Cela semble fonctionner, mais (vieil homme grincheux, activez) je n'aime pas ça.-eq
et amis à l'intérieur[[ ]]
sont aussi des contextes arithmétiques. :) (Connexes: expansion automatique des variables à l'intérieur de la commande bash [[]] )Même si les guillemets doubles ne sont pas nécessaires, les raisons de les utiliser sont:
value1
etvalue2
sont variables, et vous pourriez ne pas savoir ce qu'ils contiennent. Sinon, vous pourriez tout aussi bien demander: "Pourquoi s'embêter avec des variables au lieu de vérifierif [[ 5 -eq 3 ]]
? Ou aller plus loin, pourquoi s'embêter avec duif
tout quand vous savez déjà que 5 n'est pas égal à 3? que le fractionnement de mots ne se produira pas[[
, mais les cas où le fractionnement de mots ne se produit pas sont rares. Encore une fois, voir le premier point.)la source
Pas directement lié à votre question, mais j'utilise
quand je compare les chiffres, mais là aussi, vous n'avez pas à utiliser de guillemets.
la source
if (( value1 == value2 )); then
. Dans les contextes arithmétiques, vous n'avez même pas besoin du$
. Cependant, cette question semble se concentrer sur les variables utilisées dans les[[ ... ]]
tests.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 entre crochets simples, pour passer des arguments aux fonctions et aux scripts, ainsi que pour l'affectation de variables parfois (ce qui est complètement inutile pour les delcarations simples) - je suppose que certaines personnes, du moins je le fais, écrivez instinctivement des guillemets autour des extensions de variables .
Un avantage de faire des guillemets doubles en conséquence et de manière compréhensible - mais seulement comme cela a du sens - est que les collègues qui débutent en bash peuvent apprendre à écrire des scripts plus stables . Cela accentue également le fait que l'art du traitement des données avec bash consiste davantage à séparer les flux de données (y compris les variables) par des séparateurs de champs et à les diriger à travers des filtres . Dès que vous avez séparé vos morceaux de données du flux, tenez-les ensemble avec des guillemets doubles!
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 .
la source