Tại sao "không bao giờ sử dụng -a
hoặc -o
toán tử"?
Bởi vì chúng có thể không phù hợp và do đó chúng không tuân thủ POSIX :
Các phần mở rộng XSI chỉ định các nguyên hàm nhị phân -a và -o và các toán tử '(' và ')' đã được đánh dấu lỗi thời. (Nhiều biểu thức sử dụng chúng được định nghĩa một cách mơ hồ bởi ngữ pháp tùy thuộc vào các biểu thức cụ thể được đánh giá.) Các tập lệnh sử dụng các biểu thức này phải được chuyển đổi thành các biểu mẫu được đưa ra dưới đây. Mặc dù nhiều triển khai sẽ tiếp tục hỗ trợ các hình thức lỗi thời này, các tập lệnh nên cực kỳ cẩn thận khi xử lý đầu vào do người dùng cung cấp có thể bị nhầm lẫn với các biểu thức và toán tử gốc này. Trừ khi nhà phát triển ứng dụng biết tất cả các trường hợp tạo đầu vào cho tập lệnh, các lệnh như:
test "$1" -a "$2"
nên được viết là:
test "$1" && test "$2"
Làm thế nào tôi có thể làm "sử dụng một số [
lệnh và &&
và ||
vỏ khai thác)"?
Bằng cách thực hiện nhiều thử nghiệm và xâu chuỗi chúng bằng cách sử dụng các toán tử đã nói; ví dụ:
[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]
có thể được viết lại như tương đương:
[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])
hoặc tốt hơn:
[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }
(
và)
các toán tử nhóm lệnh? Nếu họ đã lỗi thời, sự thay thế của họ là gì? (2) Nêntest "$1" -a "$2"
được thay thế bởitest "$1" && test "$2"
, hoặc bởi((test "$1" && test "$2"))
? Chúng ta không cần((..))
?