Chuyện gì xảy ra nếu! nghĩa là?


7

Tôi đã bắt gặp một câu lệnh if / then như thế này:

if ! foo ; then
        echo "blah" 
        exit 1
fi

Cụ thể có if !nghĩa là gì? "Nếu kết quả foolà không đúng sự thật?" "Nếu mã thoát foolà 0"?


1
if !là dạng rút gọn trừ khi : -O
Jens

nó giống nhưif !=
jgr208

@Jens Booleans dễ hiểu hơn nhiều nếu bạn xem nó là ! foo(bất kể nó có trong ifhay không).
IQAndreas

@IQAndreas Tôi tin rằng đó chủ yếu là sở thích cá nhân. Ít nhất perl có một unlesstừ khóa tích hợp và một số người thích nó.
Jens

Câu trả lời:


16

!đảo ngược ý nghĩa của trạng thái thoát lệnh - đây là một phần của cú pháp shell POSIX, nó không phải là một phần của if. Từ thông số POSIX :

Nếu từ dành riêng! không đi trước đường ống, trạng thái thoát sẽ là trạng thái thoát của lệnh cuối cùng được chỉ định trong đường ống. Mặt khác, trạng thái thoát sẽ là logic KHÔNG của trạng thái thoát của lệnh cuối cùng. Nghĩa là, nếu lệnh cuối cùng trả về 0, trạng thái thoát sẽ là 1; nếu lệnh cuối cùng trả về lớn hơn 0, trạng thái thoát sẽ bằng không.


11

Nó là một toán tử boolean tương đương với logic không .

Xem man bash:

! biểu thức
    Đúng nếu biểu thức là sai.

Trong ví dụ của bạn, nếu không foo, tiếng vang blah.


6

Chỉ cần thêm vào các câu trả lời khác, mã sử dụng !để tránh viết mã như thế này:

if foo ; then
    # everything that used to follow "fi" in the previous version
else
    echo "blah" 
    exit 1
fi

Đó chỉ hoạt động nếu có một cái gì đó sau khi fitrong kịch bản, kể từ khi một sản phẩm nào ifkhoản là không hợp pháp. (Một bình luận không được tính.)

Viết nó theo cách này khiến bạn phải trả một mức độ thụt lề, điều mà những người lập trình có cấu trúc cốt lõi sẽ nói với bạn là một chi phí đáng để trả. Trường phát triển phần mềm này nói rằng exitmột chương trình ở giữa chương trình hiếm khi tốt hơn goto end, và vì gotolà một tội ác không được thừa nhận, nên mức độ lồng thêm là một sự cải thiện.

Một trường cạnh tranh nói: "Vâng, thụt lề là tuyệt vời cho đến khi bạn đẩy tất cả các mã ra khỏi phía bên phải của màn hình."

Sau đó, bạn nhận được những người nghĩ rằng cả hai trại là một ít bonkers, và chỉ cần quan sát rằng tốt hơn hết là tránh logic tiêu cực nếu có thể, và trường hợp bình thường nên là trường hợp đầu tiên, ngoại trừ vào cuối chương trình.

Chọn viện trợ kool của bạn và uống nó.

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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.