Bash: подвійний дорівнює vs -eq


47

Я роблю ціле порівняння в bash (намагаюся побачити, чи користувач працює як root), і я знайшов два різних способи зробити це:

Подвійні рівні:

if [ $UID == 0 ]
then
fi

-ек

if [ $UID -eq 0 ]
then
fi

Я розумію, що у bash немає> = або <=, тож -ge і -le, так чому ж існує a, ==якщо є -eq?

Чи є різниця в тому, як вона порівнює обидві сторони?


3
Зверніть увагу, що проміжки у дужках обов'язкові:, [ $UID -eq 0 ]ні [ $UID -eq 0].
Жил "ТАК - перестань бути злим"

Відповіді:


50

==- bashспецифічний псевдонім для =, який виконує рядкове (лексичне) порівняння замість -eqчислового порівняння. (Це назад від Perl: оператори в стилі слова є числовими, символічні - лексичними.)


Чи означає це, що якщо обидві сторони є цілими числами, вони перетворюють обидві сторони в рядки і потім порівнюють їх?
beatgammit

5
Точніше, навпаки: все є рядком, -eqговорить bashпро інтерпретацію рядків як цілі числа (створюючи 0без попередження, якщо рядок не числовий).
geekosaur

11
@tjameson Щоб навести приклад: [ 01 -eq 1 ]але [ 01 != 1 ].
Жил "ТАК - перестань бути злим"

3
Слід зазначити , що в той час ==як [оператор не є стандартним і не повинен бути використаний, це не Баш конкретного . Він був введений ksh і також підтримується zsh (хоча перше =потрібно цитувати), yash та [утиліта GNU (і будь-які такі утиліти, реалізовані як ksh-скрипти в деяких системах) принаймні).
Стефан Шазелас

@geekosaur Я отримую попередження від bash v4.3.42, якщо мій рядок не числовий: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: привіт: очікується ціле вираження
Ендрю Бейнбридж,

13

Щоб уточнити відповідь bollovan в ...

Існує немає >=або <=оператор порівняння рядків. Але ви можете використовувати їх за допомогою ((...))арифметичної команди для порівняння цілих чисел.

Ви також можете використовувати інші оператори порівняння рядків ( ==, !=, <, >, але не =) для порівняння цілих чисел , якщо ви використовуєте їх усередині ((...)).

Приклади

  • І те [[ 01 -eq 1 ]]й (( 01 == 1 ))інше ціле порівняння. Обидва вірні.
  • І те, [[ 01 == 1 ]]і [ 01 = 1 ]інше. Обидва помилкові.
  • І те (( 01 -eq 1 ))й (( 01 = 1 ))інше поверне помилку.

Примітка: Синтаксис [[...]]подвійної дужки та синтаксис подвійних дужок ((...))підтримуються не всіма оболонками.


1
Зауважте, що (за винятком mksh/ zsh(за винятком режиму POSIX (хоча це не особливість POSIX)), (( 010 == 10 ))повернеться помилковим, оскільки 010трактується як восьмеричне число (8 у десятковій кількості).
Стефан Шазелас

Зауважте, що, хоча більшість test/ [реалізації не має >=/ <=операторів ( хоч yash's [має хоч), exprє такі оператори, хоча це буде робити арифметичне порівняння, якщо аргументи будуть розпізнані як числа ( expr 01 '>=' 1повертає true, expr X01 '>=' X1повертає false).
Стефан Шазелас

7

Якщо ви хочете зробити ціле порівняння, ви краще використовувати (()), де ви також можете використовувати> = і т.д.

Приклад:

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

Або (( UID == 0 ))чи (( ! UID ))для цієї справи. Зауважте, що ((...))це нестандартно ( kshфункція також підтримується bashі zshз варіаціями).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.