我想我不清楚如何做「和」測試。我想確保存在一個與[ -e $VAR ]
配合得很好的論點,但事實證明這也是對空字符串的評估;我不想要。
我和他們在一起怎麼樣?或者還有另一個完成我想要的測試嗎?
我想我不清楚如何做「和」測試。我想確保存在一個與[ -e $VAR ]
配合得很好的論點,但事實證明這也是對空字符串的評估;我不想要。
我和他們在一起怎麼樣?或者還有另一個完成我想要的測試嗎?
if [ ! -z "$var" ] && [ -e "$var" ]; then
# something ...
fi
if [ -n "$var" -a -e "$var" ]; then
do something ...
fi
由於'POSIX'沒有定義'['與複雜測試集合的行爲,我們應該避免''使用'-a'或'-o'。我讀過[這裏](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals?highlight=%28conditional%29#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29)。 –
@ jaypal-singh你說得對,但是主題有'bash'標籤,並沒有提到POSIX,所以我發佈了這個版本,它在'bash'和其他一些現代shell下工作。 –
如果您假設使用'bash'或其他現代貝殼,則推薦'-a'的理由甚至更少*。 – chepner
從bash
手冊頁:
[[ expression ]]
- 返回取決於條件表達式表達的評價爲0或1的狀態。
而且,對於表情,其中一個選項是:
expression1 && expression2
- 如果兩個expression1
和expression2
是真實的。
所以,你可以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
我們可以用'[[-e「$ var」]] && echo「'$ var'exists'來縮短它'' –
是的,如果它是單行的(就像我的例子那樣)。如果條件塊更復雜,我不會這麼做。 – paxdiablo
簡單地引用您的變量:
[ -e "$VAR" ]
如果$VAR
爲空,則評估爲[ -e "" ]
。
您的版本無效,因爲它的計算結果爲[ -e ]
。現在在這種情況下,bash只檢查單個參數(-e
)是否爲非空字符串。
從手冊頁:
測試和[評價使用基於參數的數目的一組規則的條件表達式。 ...當且僅當該參數不爲null
1參數
表達式爲true。
(此外,該解決方案與文件名包含空間工作的額外好處)
我找到了答案,現在,感謝您的建議!
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兩次似乎效率不高,但它的工作原理...
該解決方案即使在嚴格符合POSIX標準的shell中,因此也適用於'bash';但是,要充分利用「bashisms」,請參閱@ paxdiablo的答案。 – mklement0
非常高興看到這個建議,而不是過時的'-a'。 –
我發現另一個優秀和詳細的解釋 - http://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash – valentt