2011-10-25 30 views
5

在我的bash test有態度與狀態0退出:BASH:[](測試)的行爲unconformly

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

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

這意味着當它不接受任何參數它根本就不是零。

-z正常工作,而不是如此:

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

這是預期的行爲?

+0

好問題。我不知道'test -n'和'test -z'(不帶參數)都是成功的。 –

+0

請小心使用'&&'和'||'!試試這個代碼:'touch〜/ x && touch/x ||回聲失敗「 - 如果」touch/x「失敗,將會打印」失敗「! – uzsolt

回答

5

基本上,你要求測試字符串「-z」是否非空。它是,所以它告訴你true。實際算法測試使用的是:

  • 0參數:

    退出假(1)。

  • 1論點:

    退出真(0)如果$ 1不是null;否則,退出false。

  • 2個參數:

    如果$ 1,退出真,如果$ 2爲空,假,如果$ 2不爲空 '!'。

    如果$ 1是一元主元,則在一元測試爲真時退出true,如果一元測試爲假,則返回假 。

    否則,會產生未指定的結果。

...

the POSIX test command specification引用。

0

是的,它是預期的。

$ 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返回一個退出狀態即是ALL選項正確。

嘗試這些:

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

這對OP沒有幫助。OP知道它是如何運作的。問題是關於'-n'_沒有參數的行爲_以及爲什麼它被認爲是'真實的'。 –

+0

不是真的,用操作符進行測試並且沒有操作數對所有選項都返回true。我編輯了迴應。 – aayoubi

1

據推測,不帶參數 「-n」 和 「-z」 不作爲運營商,但作爲單純的字符串處理,test "a non-empty string"是真實的。我猜想test是第一步計算它的參數,如果計數是1,只要檢查參數的長度。

+0

這是一個很好的解釋。實際上,這個理論的工作原理並沒有對比手冊,手冊沒有指定參數在參數之前被解釋。 – davide