Por que a expansão variável sem $ funciona em expressões?

15
#!/bin/bash

VALUE=10

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

Para minha surpresa, isso gera "Sim". Eu esperava que isso exigisse [[ $VALUE -eq 10 ]]. Examinei a CONDITIONAL EXPRESSIONSseção de man bash, mas não encontrei nada para explicar esse comportamento.

Heinzi
fonte

Respostas:

11

[[é bash word reservada, portanto, regras especiais de expansão, como expansão aritmética, são aplicadas, não como no caso de [. Também -eqé utilizado um operador binário aritmético . Portanto, o shell procura expressão inteira e, se o texto for encontrado no primeiro item, ele tenta expandi-lo como parâmetro. É chamado de expansão aritmética e está presente em 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.

Então, por exemplo:

[[ hdjakshdka -eq fkshdfwuefy ]]

sempre retornará verdadeiro

Mas este retornará erro

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

Também está disponível recursão:

$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")
pressa
fonte
Por que ser uma palavra reservada significa que faz avaliação aritmética? Não consigo encontrar isso documentado em lugar algum #
Mikel
Ah, aqui está. gnu.org/software/bash/manual/…
Mikel
Incluí citações na man bashminha resposta para deixar claro.
rush
@ Mikel Não é diretamente o fato de [[ser uma palavra reservada, mas porque o que está dentro [[ … ]]não é uma sintaxe de comando comum, mas uma expressão condicional. Em uma expressão condicional, os argumentos para operadores aritméticos, como -eqestão sujeitos a avaliação aritmética.
Gilles 'SO- stop be evil'
Sim. Eu estava dizendo a primeira frase dá essa idéia, que é enganosa
Mikel