Операнды численных сравнений -eq, -gt, -lt, -ge, -leи -neпринимаются в качестве арифметических выражений. С некоторыми ограничениями, они по-прежнему должны быть словами из одной оболочки.
Поведение имен переменных в арифметическом выражении описано в Shell Arithmetic :
Переменные оболочки разрешены как операнды; расширение параметра выполняется до вычисления выражения. Внутри выражения на переменные оболочки также можно ссылаться по имени без использования синтаксиса расширения параметра. Переменная оболочки, которая является нулевой или неустановленной, имеет значение 0 при обращении по имени без использования синтаксиса расширения параметра.
а также:
Значение переменной оценивается как арифметическое выражение, когда на него ссылаются
Но я не могу найти ту часть документации, в которой говорится, что числовые сравнения принимают арифметические выражения. Он не описан в Условных конструкциях в разделе [[и не описан в Условных выражениях Bash .
Но, экспериментально, кажется, работает как сказано выше.
Итак, такие вещи работают:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
это тоже (значение переменной оценивается):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Но это не так; это не одно слово оболочки при [[ .. ]]разборе, поэтому в условном выражении есть синтаксическая ошибка:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
В других арифметических контекстах нет необходимости, чтобы выражение было без пробелов. Это печатает 999, поскольку скобки однозначно разграничивают арифметическое выражение в индексе:
a[6]=999; echo ${a[1 + 2 + 3]}
С другой стороны, =сравнение является сопоставлением с шаблоном и не включает арифметику и автоматическое расширение переменных, выполняемое в арифметическом контексте (условные конструкции):
Когда ==и !=операторы используются, строка справа оператора считается образцом и подобраны в соответствии с правилами , описанными ниже в Pattern Matching, как если опция extglob оболочки были включены. =Оператор идентичен ==.
Так что это неверно, поскольку строки явно разные:
[[ "1 + 2 + 3" = 6 ]]
как это, даже если числовые значения одинаковы:
[[ 6 = 06 ]]
и здесь тоже сравниваются строки ( xи 6), они разные:
x=6
[[ x = 6 ]]
Это расширило бы переменную, так что это правда:
x=6
[[ $x = 6 ]]
x=1последуете[[ x -gt 2]]?