Чому змінне розширення без $ працює у виразах?


15
#!/bin/bash

VALUE=10

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

На мій подив, це виходить "Так". Я б очікував, що це вимагатиме [[ $VALUE -eq 10 ]]. Я просканував CONDITIONAL EXPRESSIONSрозділ man bash, але не знайшов нічого, щоб пояснити цю поведінку.

Відповіді:


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")

Чому бути зарезервованим словом означає, що це арифметичне оцінювання? Я не можу знайти цього документально ніде
Мікель


Я включив цитування man bashдо своєї відповіді, щоб зрозуміти це.
пік

@Mikel Це не безпосередньо факт, що [[це зарезервоване слово, а тому, що всередині, [[ … ]]це не звичайний синтаксис команди, а умовний вираз. У умовному вираженні аргументи арифметичних операторів, таких як -eq, підлягають арифметичній оцінці.
Жил "ТАК - перестань бути злим"

Так. Я казав, що перше речення дає таку думку, яка вводить в оману
Мікель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.