¿Por qué la expansión variable sin $ funciona en expresiones?

15
#!/bin/bash

VALUE=10

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

Para mi sorpresa, esto genera "Sí". Hubiera esperado que fuera necesario [[ $VALUE -eq 10 ]]. He escaneado la CONDITIONAL EXPRESSIONSsección de man bash, pero no encontré nada para explicar este comportamiento.

Heinzi
fuente

Respuestas:

11

[[es una palabra reservada bash, por lo tanto, se aplican reglas de expansión especiales como la expansión aritmética, no como en el caso de [. También -eqse utiliza el operador binario aritmético . Por lo tanto, el shell busca una expresión entera y si se encuentra texto en el primer elemento, intenta expandirlo como parámetro. Se llama expansión aritmética y está presente en 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.

Así por ejemplo:

[[ hdjakshdka -eq fkshdfwuefy ]]

volverá siempre cierto

Pero este devolverá un error

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

También la recursividad está disponible:

$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")
prisa
fuente
¿Por qué ser una palabra reservada significa que hace una evaluación aritmética? No puedo encontrar eso documentado en ninguna parte
Mikel
Ah, aquí está. gnu.org/software/bash/manual/…
Mikel
He incluido citas de man bashmi respuesta para que quede claro.
prisa
@Mikel No es directamente el hecho de que [[sea ​​una palabra reservada, sino porque lo que hay dentro [[ … ]]no es una sintaxis de comando ordinaria, sino una expresión condicional. En una expresión condicional, los argumentos de los operadores aritméticos -eqestán sujetos a evaluación aritmética.
Gilles 'SO- deja de ser malvado'
Si. Estaba diciendo que la primera oración da esa idea, que es engañosa
Mikel