2017-06-13 47 views
2

符合我寫了一個shell腳本來檢查,如果一個二進制存在:shell腳本,如果水珠圖案的任何文件

#!/usr/local/bin/bash 

if [ -e "/path/to/a/binary/file/app.bin" ]; then 
    echo "INFO: application has been built successfully" 
else 
    echo "ERROR: application couldn't be built". 
fi 

它工作正常,並給出了預期的效果。但是如果有很多類似的應用程序名稱(比如app1.bin, app2.bin等),我想測試"app*.bin"如果條件失敗:

#!/usr/local/bin/bash 

    if [ -e "/path/to/a/binary/file/app*.bin" ]; then 
     echo "INFO: application has been built successfully" 
    else 
     echo "ERROR: application couldn't be built". 
    fi 

我怎樣才能糾正,如果條件與app爲尋找任何二進制的存在名稱即app*.bin

+0

glob在引號內無效。即使你刪除它,如果從glob匹配 – Inian

+0

Hi @Inian返回多個文件,條件將失敗,那麼你有什麼建議。我應該如何更改代碼以便解決我的目的。 – Yash

回答

1

glob配對不適用於引號內。即使刪除了它,如果從glob匹配中返回多個文件,則條件將失敗,因爲-e僅適用於單個文件。

bash,你可以做到這一點,

# the nullglob will let the unmatched glob to handled properly 
shopt -s nullglob 
fileList=(/path/to/a/binary/file/app*.bin) 

if [ "${#fileList[@]}" -ge 1 ]; then 
    echo "INFO: application has been built successfully" 
else 
    echo "ERROR: application couldn't be built". 
fi 

# This line is optional. This is just to ensure the nullglob option is 
# reset after our computation 
shopt -u nullglob 
+4

雖然不只是'如果[-e $ {filelist}]'... *如果數組的第一個元素存在* .. –

+0

@ F.Hauri:我確實有'nullgob'選項設置正確('shopt -s nullglob ')? – Inian

+0

噢,是的,對不起:我太快了......(我不使用'nullglob')。用'-e'測試看起來乾淨而高效。通常我會嘗試不使用'shopt'來防止強大的調試操作。 –

1

另一種方法是使用compgen -G:它會生成匹配的文件列表,或者如果沒有相匹配,將一個錯誤狀態退出。使用compgen您需要引號以防止擴展。

if compgen -G "/path/to/a/binary/file/app*.bin" > /dev/null; then 
    echo "INFO: application has been built successfully" 
else 
    echo "ERROR: application couldn't be built". 
fi 
+0

謝謝@Andrea,這是符合我要求的最簡單的解決方案。謝謝! – Yash