Когда я должен использовать -eq
против =
против==
например
[[ $num -eq 0 ]]
[[ $num = 'zzz' ]]
Я наблюдал образец использования -eq
(и -ne
т. Д.) Для чисел и =
для строк. Есть ли причина для этого и когда я должен использовать==
Когда я должен использовать -eq
против =
против==
например
[[ $num -eq 0 ]]
[[ $num = 'zzz' ]]
Я наблюдал образец использования -eq
(и -ne
т. Д.) Для чисел и =
для строк. Есть ли причина для этого и когда я должен использовать==
Ответы:
Потому что это определение для этих операндов. Из тестовой документации POSIX, раздел ОПЕРАНДЫ :
s1 = s2
Истинно, если строки s1 и s2 идентичны; иначе ложно.
...
n1 -eq n2
Истинно, если целые числа n1 и n2 алгебраически равны; иначе ложно.
==
не определяется POSIX, это расширение bash
, производное от ksh
. Вы не должны использовать, ==
когда вы хотите мобильности. Из документации bash - Условные выражения Bash :
строка1 == строка2
строка1 = строка2
Истинно, если строки равны. '=' должен использоваться с командой test для соответствия POSIX.
Более подробно
следующие последовательности могут помочь:
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.
От man test
:
-eq
, так далее.
Реле к арифметическим тестам. Аргументы должны быть полностью числовыми (возможно, отрицательными) или специальным выражением `-l STRING ', которое оценивает длину STRING.
STRING1 = STRING2
True if the strings are equal.
STRING1 == STRING2
True if the strings are equal (synonym for =).
Так =
и ==
являются синонимами
Символ =
используется для сравнения строк, а -eq
для целочисленного сравнения. Оба работают с test
и с [...]
. Если вы используете bash
то с синтаксисом, [[...]]
вы можете использовать также ==
для сравнения строк. Дополнительно в bash =
и ==
с тоже [[...]]
работает patterns
(как например [[ $x == y* ]]
.