2012-08-01 60 views
4

我在bash困惑這個表達式:猛砸,對於不同的文件測試(測試-f)混亂的結果

$ var="" # empty var 
$ test -f $var; echo $? # test if such file exists 
0 # and this file exists, amazing! 
$ test -f ""; echo $? # let's try doing it without var 
1 # and all ok 

我無法理解這樣的bash的行爲,也許有人能解釋一下嗎?

+0

我可以確認在Centos 6下,我可以複製這個。 – 2012-08-01 13:59:09

+2

不是shell或測試中的錯誤。只是在你的期望錯誤:-) – Jens 2012-08-01 14:04:01

回答

6

這是因爲在test看到它之前$var的空擴展被刪除。您實際上正在運行test -f,因此test只有一個參數,即-f。根據POSIX,像-f這樣的單個參數是真的,因爲它不是空的。

POSIX test(1) specification

1 argument: 
Exit true (0) if `$1` is not null; otherwise, exit false. 

從未有與一個空文件名的文件進行測試。現在有一個明確的test -f ""有兩個參數,-f被認爲是「測試存在路徑參數」的運算符。

+0

這很酷,但例如,如果我去一個終端(不在我的家目錄),並做一個'cd「」'bash不抱怨,並沒有把我重定向到我的家目錄,它只是停留在我執行該命令的地方。爲什麼會發生? – 2012-08-01 14:02:22

+0

@FlorinStingaciu - 因爲你提供了一個空的參數。讓一個變量擴展到沒有任何東西就像沒有任何爭論一樣。始終引用您的擴展。 – jordanm 2012-08-01 14:04:07

+0

對於'cd',你的空參數不是以'/'開頭,所以它是一個相對路徑。要應用相對路徑,可以將它連接到pwd並在必要時進行解析。 pwd +空字符串== pwd,因此這種行爲是有道理的。 – FatalError 2012-08-01 14:06:36

3

var爲空時,$var在引用與否時的行爲將有所不同。

test -f $var   # <=> test -f  ==> $? is 0 
test -f "$var"  # <=> test -f "" ==> $? is 1 

所以這個例子告訴我們:我們應該引用$var

相關問題