В Bash два целых числа можно сравнить с помощью условного выражения
arg1 OP arg2
OP является одним из
-eq
,-ne
,-lt
,-le
,-gt
, или-ge
. Эти арифметические бинарные операторы возвращают true, если arg1 равно, не равно, меньше, меньше или равно, больше или больше или равно arg2 , соответственно. Arg1 и arg2 могут быть положительными или отрицательными целыми числами.
или арифметическое выражение:
<= >= < >
сравнение
== !=
равенство и неравенство
Почему у нас есть два разных способа сравнения двух целых чисел? Когда использовать что?
Например, [[ 3 -lt 2 ]]
использует условное выражение и (( 3 < 2 ))
использует арифметическое выражение. Оба возвращают 0, когда сравнение истинно
При сравнении двух целых чисел всегда можно использовать эти два метода взаимозаменяемо? Если да, почему у Bash есть два метода, а не один?
= != < <= > >=
сравнить строки .1 -eq 01
но1 != 01
и8 -lt 42
но8 > 42
Ответы:
Да, у нас есть два разных способа сравнения двух целых чисел.
Похоже, что эти факты не получили широкого распространения на этом форуме:
Внутри идиомы
[ ]
операторы для арифметического сравнения-eq
,-ne
,-lt
,-le
,-gt
и-ge
.Поскольку они также находятся внутри команды тестирования и внутри
[[ ]]
.Да в этой идиомы,
=
,<
и т.д. строковые операторы.Внутри идиомы
(( ))
операторы для арифметического сравнения==
,!=
,<
,<=
,>
, и>=
.Нет, это не «Арифметическое расширение» (которое начинается с
$
), поскольку$(( ))
. Это определяется как «Составная команда» в man bash.Да, он следует тем же правилам (внутри) «Арифметического расширения», но не имеет выходных данных, только выходное значение. Это можно использовать так:
Почему у нас есть два разных способа сравнения двух целых чисел?
Я предполагаю, что последний
(( ))
был разработан как более простой способ выполнения арифметических тестов. Это почти так же, как,$(( ))
но просто не имеет выхода.Почему два? Ну так же , как , почему у нас есть два
printf
(внешняя и встроенная) или четыре испытания (внешняяtest
, встроенная командаtest
,[
и[[
). Так растут раковины, улучшая некоторые области за один год, улучшая другие в следующем году.Когда использовать что?
Это очень сложный вопрос, потому что не должно быть эффективной разницы. Конечно, есть некоторые различия в способе
[ ]
работы и(( ))
работы внутри страны, но: что лучше сравнить два целых числа? Кто-нибудь!.При сравнении двух целых чисел всегда можно использовать эти два метода взаимозаменяемо?
На два номера я вынужден сказать да.
Но для переменных, расширений, математических операций могут быть ключевые различия, которые должны благоприятствовать тем или иным. Не могу сказать, что абсолютно оба равны. Например, он
(( ))
может выполнить несколько математических операций в последовательности:Если да, почему у Bash есть два метода, а не один?
Если оба полезны, почему бы и нет?
источник
=
является присваиванием и==
является сравнением в арифметических разложениях. Вопрос цитирует это правильно. Но ответ неверный.Исторически
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 вы обычно используете арифметические выражения для вычисления целого значения и
[ … ]
сравнения целых чисел.В сценариях ksh, bash или zsh вы можете использовать
((…))
оба варианта.[[ … ]]
Форма полезна , если вы хотите использовать условные с участием других , чем целые вещей.источник
Согласно справочной странице теста, = и! = Используются для сравнения строк, а выражения -eq, -gt, -lt, -ge, -le и -ne являются целочисленными сравнениями. Я всегда следовал этому соглашению при написании сценариев оболочки, и он всегда работает. Помните, что если в выражении есть переменные, вам может потребоваться заключить их в кавычки, чтобы избежать нулевого сравнения.
На бумаге мы проводим сравнение строк / чисел без особых раздумий. Компьютер, с другой стороны, не знает, является ли 987 числом или строкой символов. Вам нужно, чтобы разные операторы сообщали компьютеру, что делать, чтобы получить правильный результат. Существует некоторая дополнительная информация здесь , что объясняет некоторые из истории. По сути, переменные нетипизированы и остались такими для исторической совместимости.
источник
=
и!=
приведены арифметические операторы, тогда как на man-страницеtest
показаны только операторы условных выражений.