2011-01-27 29 views

Trả lời

27

Để so sánh số, bạn có thể làm:

if ! (((a == b) && (a == c))) 

Để so sánh chuỗi:

if ! [[ "$a" == "$b" && "$a" == "$c" ]] 

Trong Bash, ngoặc kép thiết lập một bối cảnh số học (trong đó dấu hiệu đồng đô la là phần lớn là tùy chọn, nhân tiện) để so sánh (cũng được sử dụng trong việc mở rộng số học for ((i=0; i<=10; i++))$(())) và được sử dụng để phân biệt chuỗi từ một tập hợp các dấu ngoặc đơn tạo ra một subshell.

này, ví dụ, thực hiện lệnh true và, vì nó luôn luôn đúng nó sẽ thực hiện hành động:

if (true); then echo hi; fi 

Đây là giống như

if true; then echo hi; fi 

ngoại trừ một subshell được tạo ra. Tuy nhiên, if ((true)) kiểm tra giá trị của biến có tên "true".

Nếu bạn đưa dấu đô la, thì "$ true" sẽ rõ ràng là biến, nhưng hành vi if với dấu ngoặc đơn (hoặc không có dấu ngoặc đơn) sẽ thay đổi.

if ($true) 

hoặc

if $true 

sẽ thực hiện các nội dung của biến như là một chỉ huy và thực hiện thao tác có điều kiện dựa trên giá trị xuất cảnh của lệnh (hoặc cung cấp cho một "command not found" tin nhắn nếu nội dung aren 't một lệnh hợp lệ).

if (($true)) 

thực hiện tương tự như if ((true)) như mô tả ở trên.

+0

Cảm ơn Dennis. Đây chính xác là loại cú pháp tôi đang tìm kiếm –

+0

+1 để giải thích về các cặp đôi đôi! Xóa các bình luận khác của tôi để dọn dẹp. – eckes

2
#!/bin/bash 

a=2 
b=3 
c=4 

if ! (((a == b) && (a == c))); then 
    # stuff here 
fi 

Bạn cũng có thể sử dụng sau đây mà cá nhân tôi thấy rõ ràng hơn:

#!/bin/bash 

a=2 
b=3 
c=4 

if (((a != b) || (a != c))); then 
    # stuff here 
fi 

Về mặt kỹ thuật nói bạn không cần dấu ngoặc xung quanh các biểu thức phụ kể từ khi các nhà khai thác bình đẳng == != có cao hơn ưu tiên sau đó cả hai nhà khai thác so sánh hợp chất && || nhưng tôi nghĩ rằng nó là khôn ngoan để giữ chúng trong đó để hiển thị ý định nếu không có gì khác.

+0

Cảm ơn SiegeX giải thích tuyệt vời tại đây! –

4
if [ "$a" != "$b" -o "$a" != "$c" ]; then 
    # ... 
else 
    # ... 
fi 
+1

Hoặc, thực hiện bản dịch trực tiếp: 'if [! \\ (\\ ("$ a" = "$ b" \\) -a \\ ("$ a" = "$ c" \\) \\)] '... –

+0

Logic để đảo ngược toán tử như thế này là [luật của De Morgan] (http://en.wikipedia.org/wiki/De_Morgan's_laws). – chrisaycock

+0

Cảm ơn Wilhelmtell. Cảm ơn bạn đã đơn giản hóa việc kiểm tra lôgic –

Các vấn đề liên quan