Операнди численних порівнянь -eq
, -gt
, -lt
, -ge
, -le
і -ne
приймаються в якості арифметичних виразів. З деяким обмеженням, вони все ще повинні бути одними оболонковими словами.
Поведінка змінних імен в арифметичному вираженні описано в арифметиці Shell :
Змінні оболонки допускаються як операнди; Розширення параметра виконується перед оцінкою виразу. У межах виразу на змінні оболонки також можна посилатись по імені без використання синтаксису розширення параметра. Змінна оболонки, яка є нульовою чи невідомою, оцінюється на 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]}
З іншого боку, =
порівняння є збігом шаблонів і не передбачає арифметики, а також автоматичного розширення змінної, виконаного в арифметичному контексті (Conditional Constructs):
Коли ==
і !=
оператори використовуються, рядок праворуч оператора вважається зразком і підібрані в відповідно до правил , описаними нижче в Pattern Matching, як якщо опція extglob оболонки були включені. =
Оператор ідентичний ==
.
Отже, це помилково, оскільки рядки, очевидно, різні:
[[ "1 + 2 + 3" = 6 ]]
як це, навіть якщо числові значення однакові:
[[ 6 = 06 ]]
і тут також порівнюються рядки ( x
і 6
), вони різні:
x=6
[[ x = 6 ]]
Однак це дозволить розширити змінну, тому це правда:
x=6
[[ $x = 6 ]]
x=1
за цим[[ x -gt 2]]
?