it-swarm-ru.tech

Bash: двойное равен vs -eq

Я делаю целочисленное сравнение в bash (пытаясь увидеть, работает ли пользователь от имени пользователя root), и я нашел два разных способа сделать это:

Двойной равно:

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

Я понимаю, что в bash нет> = или <=, только -ge и -le, так почему же есть == если есть -eq?

Есть ли разница в том, как он сравнивает обе стороны?

49
beatgammit

== является bash-конкретным псевдонимом для =, который выполняет сравнение строк (лексический) вместо -eq числовое сравнение. (Это от Perl: операторы в стиле Word являются числовыми, а символические - лексическими).

55
geekosaur

Чтобы уточнить ответ Боллована ...

Здесь нет >= или <= оператор сравнения для строк. Но вы можете использовать их с ((...)) арифметическая команда для сравнения целых чисел.

Вы также можете использовать другие операторы сравнения строк (==, !=, <, >, но нет =) сравнить целые числа, если вы используете их внутри ((...)).

Примеры

  • Обе [[ 01 -eq 1 ]] а также (( 01 == 1 )) делать целочисленные сравнения. Оба верны.
  • Обе [[ 01 == 1 ]] а также [ 01 = 1 ] сделать сравнение строк. Оба ложные.
  • Обе (( 01 -eq 1 )) а также (( 01 = 1 )) вернет ошибку.

Примечание. Синтаксис в двойных скобках [[...]] и ​​синтаксис в двойных скобках ((...)) поддерживаются не всеми оболочками.

13
toxalot

Если вы хотите сделать целочисленное сравнение, вам лучше использовать (()), где вы также можете использовать> = и т.д.

Пример:

if (( $UID == 0 )); then
   echo "You are root"
else
   echo "You are not root"
fi
7
bollovan