Операнды численных сравнений -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]]
?