unix test khi nào nên sử dụng eq vs = vs == trong các lệnh kiểm tra?


22

Khi nào tôi nên sử dụng -eqvs =vs==

ví dụ

[[ $num -eq 0 ]]

[[ $num = 'zzz' ]]

Tôi đã quan sát một mô hình sử dụng -eq(và -ne, v.v.) cho các số và =cho các chuỗi. Có một lý do cho điều này và khi nào tôi nên sử dụng==

Câu trả lời:


24

Bởi vì đó là định nghĩa cho các toán hạng đó. Từ tài liệu kiểm tra POSIX, phần OPERANDS :

s1 = s2

Đúng nếu các chuỗi s1 và s2 giống hệt nhau; mặt khác, sai

...

n1 -eq n2

Đúng nếu các số nguyên n1 và n2 bằng đại số; mặt khác, sai

==không được định nghĩa bởi POSIX, đây là phần mở rộng của bash, có nguồn gốc từ ksh. Bạn không nên sử dụng ==khi bạn muốn tính di động. Từ tài liệu bash - Biểu thức điều kiện Bash :

chuỗi1 == chuỗi2

chuỗi1 = chuỗi2

Đúng nếu các chuỗi bằng nhau. '=' nên được sử dụng với lệnh kiểm tra sự phù hợp POSIX.


3

Theo cách phức tạp hơn Các
trình tự sau có thể giúp:

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.  

2

Từ man test:

-eq v.v.

Chuyển tiếp để kiểm tra số học. Các đối số phải hoàn toàn bằng số (có thể là phủ định) hoặc biểu thức đặc biệt `-l STRING ', ước tính độ dài của CHUINGI.

STRING1 = STRING2

 True if the strings are equal.

STRING1 == STRING2

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

Vì vậy =và ==là từ đồng nghĩa


2

Biểu tượng =được sử dụng để so sánh chuỗi trong khi -eqđể so sánh số nguyên. Cả làm việc với testvà với [...]. Nếu bạn đang sử dụng bashthì với cú pháp, [[...]]bạn cũng có thể sử dụng ==để so sánh chuỗi. Ngoài ra trong bash =và ==với [[...]]các công việc patternsquá (ví dụ [[ $x == y* ]].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.