2011-10-25 18 views
5

Trong bash tôi test có một thái độ để thoát với tình trạng 0:BASH: [] (thử nghiệm) cư xử unconformly

$ test -n && echo true || echo false 
-> true 

khi

$ test -n "" && echo true || echo false 
-> false 

Nó có nghĩa là khi nó không nhận được bất kỳ tranh cãi ở tất cả, nó giả định nonzero.

Trường hợp -z hoạt động đúng thay vì:

$ test -z && echo true || echo false 
-> true 
$ test -z "" && echo true || echo false 
-> true 

Đây có phải là hành vi mong đợi?

+0

Câu hỏi hay. Tôi cũng tự hỏi _why_ cả hai 'test -n' và' test -z' (không có đối số) đều thành công. –

+0

Hãy cẩn thận với '&&' và '||'! Hãy thử mã này: 'touch ~/x && touch/x || echo fail' - nếu 'touch/x' không thành công,' fail' sẽ được in! – uzsolt

Trả lời

5

Về cơ bản, bạn đang yêu cầu kiểm tra xem chuỗi "-z" có phải là nonempty hay không. Nó là, vì vậy nó sẽ cho bạn biết true. Thuật toán thực tế thử nghiệm sử dụng là:

  • 0 đối số:

    Thoát sai (1).

  • 1 đối số:

    Thoát đúng (0) nếu 1 $ không phải là null; nếu không, thoát khỏi sai.

  • 2 đối số:

    Nếu $ 1 là, lối đúng nếu $ 2 là null, false nếu $ 2 không phải là null '!'.

    Nếu $ 1 là một số nguyên đơn, hãy thoát đúng nếu thử nghiệm đơn nhất là đúng, sai nếu thử nghiệm đơn nhất là sai.

    Nếu không, hãy tạo kết quả không xác định.

...

Quoted from the POSIX test command specification.

0

Có dự kiến.

$ man test 
-n string     True if the length of string is 
          non-zero. 
-z string     True if the length of string 
          string is zero. 

test [option] #without any operand trả về một tình trạng thoát đó là đúng đối với ALL tùy chọn.

Hãy thử những:

test -d 
test -f 
test -n 
test -G 
test -k 
... 
+0

Điều này không giúp OP.OP biết làm thế nào nó hoạt động _with_ một đối số. Câu hỏi là về hành vi của '-n' _without một đối số_ và tại sao heck nó được coi là' true'. –

+0

Không thực sự, kiểm tra với toán tử và không có toán hạng trả về true cho TẤT CẢ các tùy chọn. Tôi đã chỉnh sửa câu trả lời. – aayoubi

1

Có lẽ, không có đối số "-n" và "-z" không được coi là nhà khai thác nhưng như chỉ chuỗi, và test "a non-empty string" là đúng. Tôi đoán rằng test đếm đối số của nó như là một bước đầu tiên, và nếu đếm là 1, chỉ cần kiểm tra chiều dài của đối số.

+0

Đây là một lời giải thích tốt đẹp. Trên thực tế, lý thuyết này hoạt động và không tương phản hướng dẫn sử dụng, mà hư không xác định rằng các tham số được diễn giải TRƯỚC KHI các đối số. – davide

Các vấn đề liên quan