không bao giờ sử dụng toán tử `-a` hoặc` -o` với` [`


11

Stéphane Chazelas đã viết:

một vài quy tắc như

  • luôn luôn báo giá
  • không bao giờ sử dụng -ahoặc -ovận hành (sử dụng một số [lệnh và &&||vỏ khai thác)

Làm cho [đáng tin cậy với vỏ POSIX.

Tại sao "không bao giờ sử dụng -ahoặc -otoán tử"?

Làm thế nào tôi có thể làm "sử dụng một số [lệnh và &&||vỏ khai thác)"?

Câu trả lời:


13

Tại sao "không bao giờ sử dụng -ahoặc -otoá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ỏ 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 ]; }

cảm ơn. (1) "toán tử '(' và ')' đã bị đánh dấu lỗi thời". Là ()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ên test "$1" -a "$2"được thay thế bởi test "$1" && test "$2", hoặc bởi ((test "$1" && test "$2"))? Chúng ta không cần ((..))?
Tim

@Tim Xem bản cập nhật. (1) Có - bạn có thể sử dụng (){}thay thế. (2) Cái thứ nhất; (())được sử dụng để mở rộng số học, ở đây bạn muốn kiểm tra trạng thái thoát của chuỗi thử nghiệm, do đó, nhóm các thử nghiệm trong một lớp con ()hoặc trong vỏ hiện tại {}.
kos

Cảm ơn. Tôi nghĩ rằng câu hỏi của tôi có thể vượt ra ngoài bài viết này. Vì vậy, tôi đăng chúng trong một bài mới.
Tim

1
@Tim Lý do duy nhất để sử dụng ()toán tử là khi bạn đang sử dụng -ahoặc -o. Vì cái sau là lỗi thời, cái trước rõ ràng là không còn cần thiết nữa.
Barmar
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.