Tôi muốn thực hiện một việc như dưới đây trong tập lệnh bash. làm thế nào để tôi thực hiện cú pháp bash.sử dụng các điều kiện phức hợp trong tập lệnh bash shell
if !((a==b) && (a==c))
then
do something
end if
Tôi muốn thực hiện một việc như dưới đây trong tập lệnh bash. làm thế nào để tôi thực hiện cú pháp bash.sử dụng các điều kiện phức hợp trong tập lệnh bash shell
if !((a==b) && (a==c))
then
do something
end if
Để 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à $(())
) 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.
#!/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.
Cảm ơn SiegeX giải thích tuyệt vời tại đây! –
if [ "$a" != "$b" -o "$a" != "$c" ]; then
# ...
else
# ...
fi
Hoặc, thực hiện bản dịch trực tiếp: 'if [! \\ (\\ ("$ a" = "$ b" \\) -a \\ ("$ a" = "$ c" \\) \\)] '... –
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
Cảm ơn Wilhelmtell. Cảm ơn bạn đã đơn giản hóa việc kiểm tra lôgic –
Cảm ơn Dennis. Đây chính xác là loại cú pháp tôi đang tìm kiếm –
+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