Sự khác biệt giữa [[$ biến]] và [[-n $ biến]]?


8

Trong bash, được [[ $variable ]][[ -n $variable ]]hoàn toàn tương đương? Nó dường như là trường hợp đánh giá theo đầu ra bên dưới, nhưng tôi thấy cả hai hình thức sử dụng phổ biến trong các kịch bản shell.

$ z="abra"
$ [[ $z ]]
$ echo $?
0
$ [[ -n $z ]]
$ echo $?
0
$ z=""
$ [[ $z ]]
$ echo $?
1
$ [[ -n $z ]]
$ echo $?
1
$ unset z
$ [[ $z ]]
$ echo $?
1
$ [[ -n $z ]]
$ echo $?
1

Hừm. Hấp dẫn. Đầu ra từ [[ -n $(echo -ne "\0") ]]; echo $?[ -n $(echo -ne "\0") ]; echo $?khác nhau
dchirikov

@dchirikov, đó là bởi vì trong phần hai, bạn đã quên trích dẫn thay thế lệnh, vì vậy cuối cùng nó [ -n ]cũng như vậy [ -n -n ]. Trong các shell khác với zsh, các đối số lệnh (thậm chí dựng sẵn) hoặc các biến shell không thể chứa các ký tự NUL.
Stéphane Chazelas

Câu trả lời:


4

[ "$var" ]tương đương với [ -n "$var" ]bash và hầu hết các shell hiện nay. Trong các shell cũ khác, chúng có nghĩa là tương đương, nhưng bị các lỗi khác nhau đối với một số giá trị đặc biệt của "$ var" như =, (hoặc !.

Tôi thấy [ -n "$var" ]dễ đọc hơn và là mặt dây chuyền của [ -z "$var" ].

[[ -n $var ]]là giống như [[ $var ]]trong tất cả các shell nơi mà cú pháp ksh không chuẩn được triển khai.

test "x$var" != x sẽ là đáng tin cậy nhất nếu bạn muốn được di chuyển đến các vỏ rất cũ.


1

Theo Kiểm tra cho chuỗi có độ dài khác không trong bash: [-n Lời $ var] hoặc [Lời $ var] , vâng, chúng tương đương nhau.

Chúng tương đương thậm chí trích dẫn tên của biến.

Điều quan trọng cần lưu ý : tên của câu hỏi tôi trích dẫn chỉ đề cập đến [, nhưng câu trả lời xem xét cả [[[.


1
Nhưng [[]]không tương đương với []:)
dchirikov

Không, họ không. Nhưng trong câu trả lời tôi trích dẫn, cả hai hình thức đều được xem xét.
nozimica

Hành vi trong kiểm tra "\ 0" là một biến là khác nhau. Toán tử [] cho 0 hoặc 1. Và [[]] cho 1 trong cả hai trường hợp.
dchirikov

+1 cho liên kết rất nhiều thông tin tuy nhiên câu trả lời của Stephane Chazelas, mà tôi đã chấp nhận, có ý nghĩa hơn.
iruvar
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.