Ở Bash, liệu [-z có phải $ 1]] và nếu [Lời $ 1 thì = Ăn hay] giống nhau không?


28

Trong kịch bản shell Bash, sự khác biệt (nếu có) giữa hai câu lệnh sau là gì?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

Tôi đã thấy mình viết cái thứ hai trong một số kịch bản, nhưng sau đó tôi đọc ở đây rằng sử dụng -zđạt được điều tương tự.

Nếu có vấn đề khi sử dụng cái thứ hai, chúng ta có nên bỏ qua rằng cái đầu tiên trông tốt hơn một chút không?


3
Để so sánh chi tiết, xem câu trả lời của tôi trên Stack Overflow. Ngoài ra, xem cái nàycái này .
Tạm dừng cho đến khi có thông báo mới.

liên kết tốt đẹp, với một số câu trả lời hay :)
Johan

Câu trả lời:


36

[ "$1" = "" ][ -z "$1" ]hoàn toàn tương đương trong bash và các shell tương thích POSIX khác. (Lưu ý rằng phải có khoảng trắng ở mỗi bên của dấu ngoặc, trừ khi có một ký tự không cấu thành từ như ;.)

[là một vỏ được tích hợp như bất kỳ khác; trong thực tế nó cũng có thể được đánh vần test(sự khác biệt duy nhất giữa hai là [yêu cầu một ]đối số cuối cùng). Vì vậy, nếu bạn chạy [ "$1" = "" ]với $1mở rộng tới -z, các nhà điều hành kiểm tra thấy ba đối số: -z, =và các chuỗi rỗng. Một số shell Bourne cũ hơn đôi khi đã ném các lỗi phân tích cú pháp khi một toán hạng trông giống như một toán tử theo cách này, ngay cả khi không có sự mơ hồ trong biểu thức hoàn chỉnh. Tôi không biết liệu có phiên bản nào thực sự gặp sự cố với biểu thức cụ thể này không, nhưng các biểu thức phức tạp hơn có thể loại bỏ chúng. Cũng có thể có những phiên bản gặp rắc rối với những từ trống rỗng; những điều này cũng không được hỗ trợ [ -z "$1" ]. Một thành ngữ shell phổ biến là[ x"$1" = x"" ]. Nó tránh mọi rủi ro khi có các toán hạng được phân tích cú pháp như các toán tử vì không có toán tử nào bắt đầu bằng một chữ cái.

Trong ksh, bash và zsh, bạn có thể sử dụng cú pháp ngoặc kép , [[ -z $1 ]]. Cú pháp mới hơn này (từ cuối những năm 1980 thay vì giữa những năm 1970) đã loại bỏ nguy cơ các toán hạng được phân tách thành toán tử bằng cách sử dụng cấu trúc cú pháp đặc biệt thay vì tích hợp thông thường. Các toán tử phải xuất hiện theo nghĩa đen, không được trích dẫn trong dấu ngoặc kép và bạn không cần phải nhân đôi mở rộng biến.


Đã sửa lỗi chính tả với khoảng trống bị thiếu bên cạnh dấu ngoặc.
Johan
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.