2012-01-19 48 views
198

我想我不清楚如何做「和」測試。我想確保存在一個與[ -e $VAR ]配合得很好的論點,但事實證明這也是對空字符串的評估;我不想要。

我和他們在一起怎麼樣?或者還有另一個完成我想要的測試嗎?

回答

361
if [ ! -z "$var" ] && [ -e "$var" ]; then 
     # something ... 
fi 
+7

該解決方案即使在嚴格符合POSIX標準的shell中,因此也適用於'bash';但是,要充分利用「bashisms」,請參閱@ paxdiablo的答案。 – mklement0

+1

非常高興看到這個建議,而不是過時的'-a'。 –

+0

我發現另一個優秀和詳細的解釋 - http://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash – valentt

4
if [ -n "$var" -a -e "$var" ]; then 
    do something ... 
fi 

 

+9

由於'POSIX'沒有定義'['與複雜測試集合的行爲,我們應該避免''使用'-a'或'-o'。我讀過[這裏](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals?highlight=%28conditional%29#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29)。 –

+1

@ jaypal-singh你說得對,但是主題有'bash'標籤,並沒有提到POSIX,所以我發佈了這個版本,它在'bash'和其他一些現代shell下工作。 –

+2

如果您假設使用'bash'或其他現代貝殼,則推薦'-a'的理由甚至更少*。 – chepner

43

bash手冊頁:

[[ expression ]] - 返回取決於條件表達式表達的評價爲0或1的狀態。

而且,對於表情,其中一個選項是:

expression1 && expression2 - 如果兩個expression1expression2是真實的。

所以,你可以and在一起如下(-n-z相反的,所以我們可以擺脫!的):

if [[ -n "$var" && -e "$var" ]] ; then 
    echo "'$var' is non-empty and the file exists" 
fi 

不過,我不認爲這是需要在這種情況下, ,-e xyzzy如果xyzzy文件存在並且可以非常容易地處理空字符串,則爲true。如果這是你想要的東西,那麼你實際上並不需要的-z非空檢查:

pax> VAR=xyzzy 
pax> if [[ -e $VAR ]] ; then echo yes ; fi 
pax> VAR=/tmp 
pax> if [[ -e $VAR ]] ; then echo yes ; fi 
yes 

換句話說,只需使用:

if [[ -e "$var" ]] ; then 
    echo "'$var' exists" 
fi 
+0

我們可以用'[[-e「$ var」]] && echo「'$ var'exists'來縮短它'' –

+1

是的,如果它是單行的(就像我的例子那樣)。如果條件塊更復雜,我不會這麼做。 – paxdiablo

2

簡單地引用您的變量:

[ -e "$VAR" ] 

如果$VAR爲空,則評估爲[ -e "" ]

您的版本無效,因爲它的計算結果爲[ -e ]。現在在這種情況下,bash只檢查單個參數(-e)是否爲非空字符串。

從手冊頁:

測試和[評價使用基於參數的數目的一組規則的條件表達式。 ...當且僅當該參數不爲null

1參數

表達式爲true。

(此外,該解決方案與文件名包含空間工作的額外好處)

0

我找到了答案,現在,感謝您的建議!

for e in ./*.cutoff.txt; do 
if grep -q -E 'COX1|Cu-oxidase' $e 
then 
    echo xyz >$e.match.txt 
else 
    echo 
fi 

if grep -q -E 'AMO' $e 
then 
    echo abc >$e.match.txt 
else 
    echo 
fi; done 

對此有何評論? grep兩次似乎效率不高,但它的工作原理...

相關問題