Исторически test
команда существовала первой (по крайней мере, еще в седьмом издании Unix в 1979 году). Раньше операторы =
и !=
сравнение строк, и -eq
, -ne
, -lt
и т.д. для сравнения чисел. Например, test 0 = 00
ложно, но test 0 -eq 00
верно. Я не знаю, почему был выбран этот синтаксис, но, возможно, это было сделано для того, чтобы избежать использования <
и >
, которое оболочка проанализировала бы как операторы перенаправления. Через test
несколько лет команда получила другой синтаксис: [ … ]
эквивалентно test …
.
[[ … ]]
Условный синтаксис, внутри которого <
и >
может быть использован в качестве операторов , не цитируя, был добавлен позже, в KSH. Он сохранял обратную совместимость с [ … ]
, поэтому он использовал те же операторы, но добавил <
и >
для сравнения строк (например, [[ 9 > 10 ]]
но [[ 9 -lt 10 ]]
). Для получения дополнительной информации см. Использование одинарной или двойной скобки - bash
Арифметические выражения также появились позже, чем test
команда, в оболочке Korn , в какое-то время в 1980-х годах. Они следовали синтаксису языка Си, который был очень популярен в кругах Unix. Таким образом, они использовали операторы Си: ==
для равенства, <=
для менее или равных и т. Д.
Unix Seventh Edition не имел арифметических выражений, но в нем была 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