Tôi đã Bash scripting trong một thời gian và tôi tự hỏi nếu có bất kỳ sự khác biệt giữa hai hình thức phủ định với lệnh test
:Có sự khác biệt nào giữa việc phủ nhận trước/sau một lệnh kiểm tra không?
if [ ! condition ]; then
fi
if ! [ condition ]; then
fi
Đầu tiên nói với vỏ để vượt qua các đối số ! condition
để kiểm tra , để chương trình tự chăm sóc bản thân phủ định. Mặt khác, lần thứ hai vượt qua condition
để kiểm tra và cho phép trình bao tự phủ nhận mã lỗi.
Có bất kỳ cạm bẫy nào tôi cần lưu ý khi chọn giữa hai biểu mẫu này không? Giá trị nào của $condition
có thể làm cho kết quả khác nhau giữa chúng?
(Tôi có vẻ nhớ đọc một bài báo cách đây một thời gian thảo luận về điều này, nhưng tôi không nhớ làm thế nào để tìm thấy nó/chính xác những gì đã được thảo luận.)
Không thực sự là một điều đáng tiếc, vì thật khó để xây dựng một kịch bản thực tế nơi điều này sẽ xảy ra, nhưng hãy nhớ rằng trong '! [condition] 'the'! 'là một toán tử shell, phủ nhận trạng thái thoát của một lệnh, trong khi trong' [! condition '' '' chỉ là một đối số chuỗi cho lệnh '['. Sau 'foo ="! Bar "', so sánh '[" $ foo "]' với '[$ foo]'. – chepner