Почему раскрытие переменной без $ работает в выражениях?

15
#!/bin/bash

VALUE=10

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

К моему удивлению, это выводит «Да». Я бы ожидал, что это потребует [[ $VALUE -eq 10 ]]. Я отсканировал CONDITIONAL EXPRESSIONSраздел man bash, но я не нашел ничего, чтобы объяснить это поведение.

Heinzi
источник

Ответы:

11

[[является зарезервированным словом bash, поэтому применяются специальные правила расширения, такие как арифметическое расширение, а не как в случае с [. Также используется арифметический бинарный оператор -eq. Поэтому оболочка ищет целочисленное выражение и, если текст найден в первом элементе, она пытается раскрыть его как параметр. Это называется арифметическим расширением и присутствует в 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.

Так, например:

[[ hdjakshdka -eq fkshdfwuefy ]]

вернется всегда правда

Но этот вернет ошибку

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

Также доступна рекурсия:

$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")
порыв
источник
Почему слово «зарезервировано» означает, что оно выполняет арифметическую оценку? Я не могу найти это нигде документально
Mikel
Ах, вот оно. gnu.org/software/bash/manual/…
Микель
Я включил цитату из man bashмоего ответа, чтобы прояснить.
Раш
@Mikel Это не тот факт, что [[это зарезервированное слово, а потому, что внутри [[ … ]]него не обычный синтаксис команды, а условное выражение. В условном выражении аргументы арифметических операторов, таких как -eq, подлежат арифметической оценке.
Жиль "ТАК - перестань быть злым"
Да. Я говорил, что первое предложение дает ту идею, которая вводит в заблуждение
Микель