2010-09-28 26 views
55

tôi đã xác định các biến sau đây:Làm thế nào để đánh giá một biến boolean trong một khối nếu bash?

myVar=true 

bây giờ tôi muốn chạy một cái gì đó dọc theo dòng này:

if [ myVar ] 
then 
    echo "true" 
else 
    echo "false" 
fi 

Đoạn mã trên làm việc, nhưng nếu tôi cố gắng thiết lập

myVar=false 

nó vẫn sẽ xuất đúng. Điều gì có thể là vấn đề?

sửa: Tôi biết tôi có thể làm điều gì đó có dạng

if [ "$myVar" = "true" ]; then ... 

nhưng nó là kinda khó xử.

Cảm ơn

+0

Xem thêm: http://stackoverflow.com/questions/2953646/how-to-declare-and-use-boolean-variables-in-shell-script/21210966#21210966 –

Trả lời

93

bash không biết biến boolean, cũng không test (đó là những gì được gọi là khi bạn sử dụng [).

Một giải pháp sẽ là:

if $myVar ; then ... ; fi 

truefalse là lệnh trả lại 0 hoặc 1 tương ứng đó là những gì if hy vọng.

Lưu ý rằng các giá trị được "đổi chỗ". Lệnh sau if phải trả lại 0 khi thành công trong khi 0 có nghĩa là "sai" trong hầu hết các ngôn ngữ lập trình.

CẢNH BÁO AN NINH: Điều này hoạt động vì BASH mở rộng biến, sau đó cố thực hiện kết quả dưới dạng lệnh! Hãy chắc chắn rằng các biến không thể chứa mã độc như rm -rf /

+0

+1 để đánh tôi vào cú đấm , và với một lời giải thích tốt quá :-) –

+1

Có thể thêm không quên '; fi' ở cuối. Vì vậy, nó là 'nếu $ myVar; sau đó ... ; fi' – IanBussieres

+5

và 'if! $ myVar; sau đó ... ; fi' cung cấp cho các converse – Pancho

32

Lưu ý rằng if $myVar; then ... ;fi xây dựng có vấn đề về bảo mật mà bạn có thể muốn tránh với

case $myvar in 
    (true) echo "is true";; 
    (false) echo "is false";; 
    (rm -rf*) echo "I just dodged a bullet";; 
esac 

Bạn cũng có thể muốn suy nghĩ lại tại sao if [ "$myvar" = "true" ] vẻ lúng túng cho bạn . Đó là một so sánh chuỗi vỏ mà nhịp đập có thể forking một quá trình chỉ để có được một trạng thái thoát. Một ngã ba là một hoạt động nặng và tốn kém, trong khi một so sánh chuỗi là chết rẻ. Hãy suy nghĩ một vài chu kỳ CPU so với vài nghìn. Giải pháp case của tôi cũng được xử lý mà không có dĩa.

+1

'true' và' false' là các lệnh dựng sẵn trong hầu hết các hệ vỏ.Gọi chúng là không yêu cầu một cuộc gọi 'fork()'. –

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