Исторически 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