tes unix kapan harus menggunakan eq vs = vs == dalam perintah uji?

22

Kapan saya harus menggunakan -eqvs =vs==

misalnya

[[ $num -eq 0 ]]

[[ $num = 'zzz' ]]

Saya telah mengamati pola penggunaan -eq(dan -ne, dll.) Untuk angka dan =untuk string. Apakah ada alasan untuk ini dan kapan saya harus menggunakan==

Michael Durrant
sumber

Jawaban:

24

Karena itulah definisi untuk operan tersebut. Dari dokumentasi tes POSIX, bagian OPERANDS :

s1 = s2

Benar jika string s1 dan s2 identik; jika tidak, salah.

...

n1 -eq n2

Benar jika bilangan bulat n1 dan n2 secara aljabar sama; jika tidak, salah.

==tidak didefinisikan oleh POSIX, ini merupakan perpanjangan dari bash, berasal dari ksh. Anda tidak boleh menggunakannya ==saat menginginkan portabilitas. Dari dokumentasi bash - Ekspresi Bersyarat Bash :

string1 == string2

string1 = string2

Benar jika senarnya sama. '=' harus digunakan dengan perintah tes untuk kesesuaian POSIX.

cuonglm
sumber
3

Dengan cara yang lebih rumit,
urutan berikut dapat membantu:

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
sumber
2

Dari man test:

-eq , dll.

Relay ke tes aritmatika. Argumen harus seluruhnya numerik (mungkin negatif), atau ungkapan khusus `-l STRING ', yang mengevaluasi panjang STRING.

STRING1 = STRING2

 True if the strings are equal.

STRING1 == STRING2

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

Jadi =dan ==sinonim

Costas
sumber
2

Simbol =digunakan untuk perbandingan string sedangkan -equntuk perbandingan integer. Keduanya bekerja dengan testdan dengan [...]. Jika Anda menggunakan bashmaka dengan sintaks [[...]]Anda dapat menggunakan juga ==untuk perbandingan string. Selain itu di bash =dan ==dengan [[...]]karya patternsjuga (seperti misalnya [[ $x == y* ]].

jimmij
sumber