Pourquoi l'expansion variable sans $ fonctionne-t-elle dans les expressions?

15
#!/bin/bash

VALUE=10

if [[ VALUE -eq 10 ]]
then
    echo "Yes"
fi

À ma grande surprise, cela donne "Oui". Je me serais attendu à ce que cela demande [[ $VALUE -eq 10 ]]. J'ai scanné la CONDITIONAL EXPRESSIONSsection de man bash, mais je n'ai rien trouvé pour expliquer ce comportement.

Heinzi
la source

Réponses:

11

[[est un mot réservé bash, donc des règles d'expansion spéciales telles que l'expansion arithmétique sont appliquées, pas comme dans le cas avec [. Un opérateur binaire arithmétique -eqest également utilisé. Par conséquent, le shell recherche une expression entière et si du texte est trouvé au premier élément, il essaie de le développer en tant que paramètre. Elle est appelée expansion arithmétique et est présente dans man bash.

RESERVED WORDS
       Reserved words are words that have a special meaning to the shell.  
       The following words are recognized as reserved 
       
       [[ ]]

[[ expression ]]
       Return  a  status  of 0 or 1 depending on the evaluation of 
       the conditional expression expression.  Expressions are 
       composed of the primaries described below under CONDITIONAL 
       EXPRESSIONS.  Word splitting and pathname expansion are not 
       performed on the words between the  [[  and  ]];  tilde 
       expansion, parameter and variable expansion, >>>_arithmetic 
       expansion_<<<, command substitution, process substitution, and 
       quote removal are performed.  

Arithmetic Expansion
       
       The evaluation is performed according to the rules listed below 
       under ARITHMETIC EVALUATION.

ARITHMETIC EVALUATION
       
       Within an expression, shell variables may also be referenced 
       by name without using the parameter expansion syntax.

Ainsi, par exemple:

[[ hdjakshdka -eq fkshdfwuefy ]]

reviendra toujours vrai

Mais celui-ci renverra une erreur

$ [[ 1235hsdkjfh -eq 81749hfjsdkhf ]]
-bash: [[: 1235hsdkjfh: value too great for base (error token is "1235hsdkjfh")

La récursivité est également disponible:

$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")
se ruer
la source
Pourquoi est-ce qu'un mot réservé signifie qu'il fait une évaluation arithmétique? Je ne trouve cela documenté nulle part
Mikel
Ah, le voici. gnu.org/software/bash/manual/…
Mikel
J'ai inclus la citation de man bashà ma réponse pour que ce soit clair.
rush
@Mikel Ce n'est pas directement le fait qu'il [[s'agit d'un mot réservé, mais parce que ce qu'il contient [[ … ]]n'est pas une syntaxe de commande ordinaire, mais une expression conditionnelle. Dans une expression conditionnelle, les arguments des opérateurs arithmétiques tels que -eqsont soumis à une évaluation arithmétique.
Gilles 'SO- arrête d'être méchant'
Oui. Je disais que la première phrase donne cette idée, ce qui est trompeur
Mikel