
Когда мне следует использовать -eq
vs =
vs==
например
[[ $num -eq 0 ]]
[[ $num = 'zzz' ]]
Я заметил закономерность использования -eq
(и -ne
и т.д.) для чисел и =
строк. Есть ли причина для этого и когда мне следует использовать==
решение1
Потому что это определение для этих операндов.Тестовая документация POSIX, раздел OPERANDS:
с1 = с2
True, если строки s1 и s2 идентичны; в противном случае — false.
...
n1 -экв n2
Истина, если целые числа n1 и n2 алгебраически равны; в противном случае — ложь.
==
не определено POSIX, это расширение bash
, полученное из ksh
. Не следует использовать, ==
если вам нужна переносимость. Издокументация bash - Условные выражения Bash:
строка1 == строка2
строка1 = строка2
Истина, если строки равны.Для соответствия POSIX с тестовой командой следует использовать '='.
решение2
Символ =
используется для сравнения строк, а -eq
для сравнения целых чисел. Оба работают с test
и с [...]
. Если вы используете bash
then с синтаксисом, [[...]]
вы также можете использовать ==
для сравнения строк. Кроме того, в bash =
и ==
with тоже [[...]]
работает для patterns
(например [[ $x == y* ]]
, .
решение3
Более подробно
могут помочь следующие последовательности:
gnu:~$ [ sam -eq sam ]
bash: [: sam: integer expression expected
gnu:~$ echo "Exit status of \"[ sam -eq sam ]\" is $?."
Exit status of "[ sam -eq sam ]" is 2.
gnu:~$ [ 5 -eq 5 ]
gnu:~$ echo "Exit status of \"[ 5 -eq 5 ]\" is $?."
Exit status of "[ 5 -eq 5 ]" is 0.
gnu:~$ [ 5 = 5 ]
gnu:~$ echo "Exit status of \"[ 5 = 5 ]\" is $?."
Exit status of "[ 5 = 5 ]" is 0.
gnu:~$ [ sam = sam ]
gnu:~$ echo "Exit status of \"[ sam = sam ]\" is $?."
Exit status of "[ sam = sam ]" is 0.
gnu:~$ [ 5 == 5 ]
gnu:~$ echo "Exit status of \"[ 5 == 5 ]\" is $?."
Exit status of "[ 5 == 5 ]" is 0.
gnu:~$ [ sam == sam ]
gnu:~$ echo "Exit status of \"[ sam == sam ]\" is $?."
Exit status of "[ sam == sam ]" is 0.
gnu:~$ (( 5 == 5 ))
gnu:~$ echo "Exit status of \"(( 5 == 5 ))\" is $?."
Exit status of "(( 5 == 5 ))" is 0.
gnu:~$ (( sam == sam ))
gnu:~$ echo "Exit status of \"(( sam == sam ))\" is $?."
Exit status of "(( sam == sam ))" is 0.
gnu:~$ ( sam = sam )
The program 'sam' is currently not installed. You can install it by typing:
sudo apt-get install simon
gnu:~$ echo "Exit status of \"( sam = sam )\" is $?."
Exit status of "( sam = sam )" is 127.
gnu:~$ ( 5 = 5 )
5: command not found
gnu:~$ echo "Exit status of \"( 5 = 5 )\" is $?."
Exit status of "( 5 = 5 )" is 127.
gnu:~$ ( sam == sam )
The program 'sam' is currently not installed. You can install it by typing:
sudo apt-get install simon
gnu:~$ echo "Exit status of \"( sam == sam )\" is $?."
Exit status of "( sam == sam )" is 127.
gnu:~$ ( 5 == 5 )
5: command not found
gnu:~$ echo "Exit status of \"( 5 == 5 )\" is $?."
Exit status of "( 5 == 5 )" is 127.
решение4
От man test
:
-eq
, и т. д.
Переходим к арифметическим тестам. Аргументы должны быть полностью числовыми (возможно, отрицательными) или специальным выражением `-l STRING', которое вычисляется как длина STRING.
STRING1 = STRING2
True if the strings are equal.
STRING1 == STRING2
True if the strings are equal (synonym for =).
Так =
и ==
являются синонимами