Unix тест, когда использовать eq vs = vs == в тестовых командах?

22

Когда я должен использовать -eqпротив =против==

например

[[ $num -eq 0 ]]

[[ $num = 'zzz' ]]

Я наблюдал образец использования -eq-neт. Д.) Для чисел и =для строк. Есть ли причина для этого и когда я должен использовать==

Майкл Даррант
источник

Ответы:

24

Потому что это определение для этих операндов. Из тестовой документации POSIX, раздел ОПЕРАНДЫ :

s1 = s2

Истинно, если строки s1 и s2 идентичны; иначе ложно.

...

n1 -eq n2

Истинно, если целые числа n1 и n2 алгебраически равны; иначе ложно.

==не определяется POSIX, это расширение bash, производное от ksh. Вы не должны использовать, ==когда вы хотите мобильности. Из документации bash - Условные выражения Bash :

строка1 == строка2

строка1 = строка2

Истинно, если строки равны. '=' должен использоваться с командой test для соответствия POSIX.

cuonglm
источник
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.  
amolveer
источник
2

От man test:

-eq , так далее.

Реле к арифметическим тестам. Аргументы должны быть полностью числовыми (возможно, отрицательными) или специальным выражением `-l STRING ', которое оценивает длину STRING.

STRING1 = STRING2

 True if the strings are equal.

STRING1 == STRING2

 True if the strings are equal (synonym for =).

Так =и ==являются синонимами

Костас
источник
2

Символ =используется для сравнения строк, а -eqдля целочисленного сравнения. Оба работают с testи с [...]. Если вы используете bashто с синтаксисом, [[...]]вы можете использовать также ==для сравнения строк. Дополнительно в bash =и ==с тоже [[...]]работает patterns(как например [[ $x == y* ]].

jimmij
источник