2014-09-05 37 views
1

我要檢查是否存在匹配的給定圖案的文件中的目標目錄存在,從而寫擊檢查文件存在與文件擴展

data_dir="/home" 
sample="HT001" 
r1Pattern=".R1.gz" 
shopt -s nullglob 

if [ -f ${data_dir}/${sample}*combined${r1Pattern} ] 
then 
    ./myscript 
fi 

沒有/home/HT001_combined.R1.gz存在。但是這個代碼一直告訴我文件存在。有什麼我錯過了嗎?

謝謝。

+0

'file $ {data_dir}/$ {sample} * combined $ {r1Pattern }'顯示什麼? – Biffen 2014-09-05 17:54:38

回答

4

這是因爲nullglob模式。由於該文件不存在,glob擴展爲空。而且,對於一個空arguement,-f會如果使用[返回true:

$ empty= 
$ [ -f $empty ] && echo yes 
yes 

你能解決你的問題,通過使用bash[[代替:

$ [[ -f $empty ]] && echo yes 

[[通常提供更加可預測的和友好的行爲。

編輯:

是的,你是對的,看來實際使用[[當水珠不評估。我想到的做的方式,它更像是:

f=(${data_dir}/${sample}*combined${r1Pattern}) 
if ((${#f[@]} == 1)) && [[ -f ${f[0]} ]] 
then 
    # ... 
fi 

這擴大了水珠到一個數組,可以確保正是一個結果出現,並驗證它是一個普通文件。

+2

技術上'-f'沒有返回true。它沒有被視爲(通過''''作爲測試參數,而是作爲用'-n'測試的字符串。如果沒有nullglob,這也會以其他有趣的方式失敗。 – 2014-09-05 18:05:36

+0

啊,更有意義爲什麼現在,謝謝! – FatalError 2014-09-05 18:07:04

+0

另外'[['是bash特有的,僅用於記錄。 – 2014-09-05 18:10:55