Я делаю целочисленное сравнение в bash (пытаясь увидеть, работает ли пользователь от имени пользователя root), и я нашел два разных способа сделать это:
Двойной равно:
if [ $UID == 0 ]
then
fi
-eq
if [ $UID -eq 0 ]
then
fi
Я понимаю, что в bash нет> = или <=, только -ge и -le, так почему же есть a, ==
если есть -eq
?
Есть ли разница в том, как он сравнивает обе стороны?
bash
shell
arithmetic
beatgammit
источник
источник
[ $UID -eq 0 ]
не[ $UID -eq 0]
.Ответы:
==
являетсяbash
-специфическим псевдонимом=
, который выполняет строку (лексическое) сравнение вместо-eq
числового сравнения. (Это от Perl: операторы в стиле слова являются числовыми, а символические - лексическими).источник
-eq
говоритbash
о том, что нужно интерпретировать строки как целые числа (0
без предупреждения, если строка не числовая).[ 01 -eq 1 ]
но[ 01 != 1 ]
.==
как[
оператор не является стандартным и не должен быть использован, это не Баш конкретного . Он был введен ksh и также поддерживается zsh (хотя первый=
должен быть заключен в кавычки), yash и[
утилитой GNU (и любыми такими утилитами, реализованными как скрипты ksh в некоторых системах), по крайней мере).$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hello: ожидается целочисленное выражениеЧтобы уточнить ответ боллована ...
Нет оператора сравнения
>=
или<=
для строк. Но вы можете использовать их с((...))
арифметической командой для сравнения целых чисел.Вы также можете использовать другие операторы сравнения строк (
==
,!=
,<
,>
, но не=
) для сравнения целых чисел , если вы используете их внутри((...))
.Примеры
[[ 01 -eq 1 ]]
и другое(( 01 == 1 ))
делают целочисленные сравнения. Оба верны.[[ 01 == 1 ]]
и[ 01 = 1 ]
строки сравнения. Оба ложные.(( 01 -eq 1 ))
и(( 01 = 1 ))
вернут ошибку.Примечание. Синтаксис
[[...]]
с двойными скобками и синтаксис с двойными скобками((...))
поддерживаются не всеми оболочками.источник
mksh
/zsh
(кроме режима POSIX (хотя это не функция POSIX))),(( 010 == 10 ))
вернет false, потому010
что будет рассматриваться как восьмеричное число (8 в десятичном виде).test
/[
реализации не имеют>=
/<=
операторы (yash
«S[
имеет хотя),expr
есть такие операторы, хотя он будет делать арифметическое сравнение , если аргументы признаются в качестве числа (expr 01 '>=' 1
возвращает значение ИСТИНА,expr X01 '>=' X1
возвращается FALSE).Если вы хотите сделать целочисленное сравнение, вам лучше использовать (()), где вы также можете использовать> = и т. Д.
Пример:
источник
(( UID == 0 ))
или(( ! UID ))
для этого имеет значение. Обратите внимание, что((...))
это нестандартно (ksh
функция также поддерживаетсяbash
иzsh
с вариациями).