Có phải [Hồi $ VAR xông = hung phạm] và [-z Lời $ VAR]] luôn luôn tương đương?


8

Mã của tôi trông giống như thế này:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done

Vì vậy, tôi muốn thăm dò đầu ra của command, cho đến khi important_stringxuất hiện và đưa vào $VAR.

Có sự khác biệt về chức năng giữa [ -z "$VAR" ][ "$VAR" = "" ]?


3
==là cú pháp không chính xác, nhưng hoạt động trong nhiều shell (có lẽ vì đó là bộ nhớ cơ cho bất kỳ ai sử dụng các ngôn ngữ khác). Bạn nên sử dụng =.
l0b0

@ l0b0 sao chép ==từ đâu đó. Lỗi của tôi.
Minix

Câu trả lời:


5

Vâng, họ ( [ -z "$VAR" ][ "$VAR" = "" ]...) là tương đương. Cả hai đều đang kiểm tra sự trống rỗng của $VAR(ví dụ khi nó không bị ràng buộc hoặc được đặt thành một chuỗi trống).

Theo nhận xét của Celada , những điều tồi tệ có thể xảy ra khi sử dụng [ "$VAR" = "" ] if VARlà một thử nghiệm hợp lệ (ví dụ: nếu VAR-z), đặc biệt khi [(hoặc test) không phải là một vỏ dựng sẵn. Nhưng trên bashhoặc zshnhững [là một dựng sẵn và điều đó dường như không phải là một vấn đề. Bạn có thể sử dụng [ "x$VAR" = "x" ]cho bài kiểm tra của bạn. Xem thử nghiệm (1)

Tất nhiên, tôi giả sử một số vỏ POSIX hoặc một cái gì đó tương tự.

Có lẽ -zcó thể nhanh hơn một chút (nhưng bạn không nên quan tâm đến micro giây trong các tập lệnh shell) và bạn có thể thấy =có lẽ dễ đọc hơn.


5
Tôi mặc dù chắc chắn rằng điều đó [ "$VAR" = "" ]là sai bởi vì nếu nội dung $VARbắt đầu bằng dấu gạch nối thì nó sẽ dẫn đến lỗi cú pháp, ví dụ nếu $VARchứa -zthì nó sẽ mở rộng sang [ -z = "" ]- kiểm tra đó =có trống không (mà không phải) và sau đó coi ""như một cuộc tranh luận không liên quan? Nhưng tôi dường như không thể làm cho nó thất bại theo cách đó bây giờ khi tôi thử nó sau khi đọc câu trả lời của bạn! Tôi đã sử dụng các biện pháp như [ "x$VAR" = "xfoo" ]để bảo vệ chống lại các nhân vật đặc biệt trong $VARnhiều thập kỷ, có lẽ không cần thiết!
Celada

@Celada: Tôi nghĩ rằng quan điểm của bạn là đúng đối với các shell hiếm mà testkhông phải là nội trang.
Basile Starynkevitch 6/07/2015

1
Tôi nghĩ rằng các phần mở rộng được tích hợp sẵn nên hoạt động giống như các lệnh bên ngoài. Bạn đã không nhầm lẫn nó với các từ khóa như [[trong bash? Họ thực sự khác nhau. --- Tôi không quan sát bất kỳ hành vi đặc biệt nào liên quan đến việc mở rộng biến đổi với sự testtích hợp của bash.
pabouk

Tôi đã thử nghiệm vớizsh
Basile Starynkevitch

@Celada thực sự, bạn đã đúng, chỉ có rất nhiều thứ có thể sai khi sử dụng [ "$VAR" = "" ]mà an toàn hơn để sử dụng -zthay thế.
Braiam
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.