Історично test
команда існувала спочатку (принаймні, ще до сьомої редакції Unix у 1979 році). Раніше оператори =
і !=
порівняння рядків, і -eq
, -ne
, -lt
і т.д. для порівняння чисел. Наприклад, test 0 = 00
помилково, але test 0 -eq 00
правда. Я не знаю, чому був вибраний цей синтаксис, але можливо, це було уникнути використання <
та >
, який оболонку розібрав би як операторів перенаправлення. Через test
кілька років команда отримала ще один синтаксис: [ … ]
еквівалентна test …
.
[[ … ]]
Умовний синтаксис, всередині якого <
і >
може бути використаний в якості операторів , не цитуючи, був доданий пізніше, в KSH. Він зберігав зворотну сумісність із [ … ]
, тому використовував ті самі оператори, але додав <
і >
для порівняння рядків (наприклад, [[ 9 > 10 ]]
але [[ 9 -lt 10 ]]
). Для отримання додаткової інформації див. Використання однієї або подвійної дужки - bash
Арифметичні вирази також з'явилися пізніше, ніж test
команда, в оболонці Корна , якийсь час у 1980-х. Вони дотримувалися синтаксису мови С, який був дуже популярний у колах Unix. Таким чином, вони використовували оператори C: ==
для рівності, <=
для менших або рівних тощо.
У Unix сьомої редакції не було арифметичних виразів, але вона мала expr
команду , яка також реалізувала C-подібний синтаксис для цілих операцій, включаючи оператори порівняння. У сценарії оболонки символи <
та >
їх потрібно було цитувати, щоб захистити їх від оболонки, наприклад if expr 1 \< 2; …
, еквівалентно if test 1 -lt 2; …
. Додавання арифметичних виразів до оболонки зробило більшість застосувань expr
застарілими, тому це невідомо сьогодні.
У скрипті sh ви зазвичай використовуєте арифметичні вирази для обчислення цілого значення та [ … ]
для порівняння цілих чисел.
if [ "$((x + y))" -lt "$z" ]; then …
У сценарії ksh, bash або zsh ви можете використовувати ((…))
і те, і інше.
if ((x + y < z)); then …
[[ … ]]
Форма корисна , якщо ви хочете використовувати умовні з участю інших , ніж цілі речей.
= != < <= > >=
порівняйте рядки .1 -eq 01
але1 != 01
і8 -lt 42
але8 > 42