2010-09-28 51 views
3

我想確定一個文件或目錄是否不存在。我想下面的命令,看是否有文件確實存在,他們正常工作:與bash不是運營商的奇怪

if [ -a 'settings.py' ]; then echo 'exists'; fi 
exists #output 
if [ -a 'foo' ]; then echo 'exists'; fi #outputs nothing 

但當我嘗試這個辦法:

if [ ! -a 'settings.py' ]; then echo 'does not exist'; fi 
does not exist #shouldn't be output since the file does exist 
if [ ! -a 'foo' ]; then echo 'does not exist'; fi 
does not exist 

「不存在」輸出不管。代替-a

本頁面使用-eLinux Documentation Project

回答

1

嘗試說:

-a是在效果上-e相同。但它已被棄用,並且它的使用是不鼓勵的。

+2

呀。進一步解釋:當'-a'不是''後的第一個事物時,'-a'被解釋爲「和」而不是「存在測試」。 「不」和「無意義,你說? Ayup。這是你不應該在他們的「和」/「或」含義中使用'-a' /'-o'的原因之一。使用'[...] && [...]'/'[...] || [...]而不是。令人討厭的冗長,你說? Ayup。殼牌吸十一點電影。 – zwol 2010-09-28 05:11:29

2

我以前遇到過[命令的問題。我更喜歡[[變種,因爲它更強大,根據我的經驗,不太可能像這樣「陷阱」。

如果使用[[命令,測試命令做工精細:

pax> touch qq 
pax> if [[ -a qq ]] ; then echo exists ; fi 
exists 
pax> if [[ ! -a qq ]] ; then echo not exists ; fi 
pax> rm qq 
pax> if [[ ! -a qq ]] ; then echo not exists ; fi 
not exists 
+0

我不能不同意更多 - '['是可移植的,如果你知道它的所有怪癖; '[['不能被依賴存在。 – zwol 2010-09-28 05:08:09

+3

@Zack,問題被標記爲'bash'。我知道其他shell可能不提供它。我相信你可能會反對更多 - 你只需要更努力:-) – paxdiablo 2010-09-28 05:10:42

+3

另外,[''你可以使用'&&'和'||',而不必分解括號內的表達式。 '[[foo && bar || baz]]'而不是'[foo] && [bar] || [baz]' – 2010-09-28 05:27:24

0

可以使用test

test -e "$file" && echo "exists"