Bash
在 Bash if 條件下,如何檢查是否存在與簡單萬用字元表達式匹配的文件?
愚蠢的是,我一直在使用這樣的條件作為腳本的一部分:
if [ $(ls FOO* 2> /dev/null) ] # if files named "FOO*" were downloaded then echo "Files found" # ... process and email results else echo "Not found" # ... email warning that no files were found (against expectations) fi
這適用於零個和一個名為的文件
FOO*
,但如果有多個. 從日誌中我發現了幾個不同的錯誤消息:[: FOO_20131107_082920: unary operator expected [: FOO_20131108_070203: binary operator expected [: too many arguments
我的問題是:在 Bash
if
條件下檢查一個或多個名稱以開頭的文件是否FOO
存在的正確方法是什麼?GNU bash,版本 4.2.25(1)-release (x86_64-pc-linux-gnu)
發生這種情況是因為您對 ls 的命令替換輸出了空格,並且在傳遞給
[
. 一種不易損壞的方法是將文件放在一個數組中,然後檢查該數組是否至少有一個成員。shopt -s nullglob files=( FOO* ) if (( ${#files[@]} )); then # there were files fi
這是因為
((
預設情況下,如果值不等於 0,則返回 true,並${#files[@]}
獲取數組中的項目數(如果有與 glob 匹配的文件,則將 >0)。只要
nullglob
未設置,您也可以執行以下操作:if ls FOO* >/dev/null 2>&1; then # there were files fi
這只是檢查 的退出程式碼
ls
,如果您傳遞了一個不存在的文件名,則該程式碼將為 1(文字FOO*
,如果沒有匹配項(當然,除非您是邪惡的並且有一個名為 的文件FOO*
,在這種情況下它將返回 0 :-) ))。請注意,這兩個也匹配目錄。如果您真的只想匹配正常文件,則需要測試:
for file in FOO*; do if [[ -f $file ]]; then # file found, do some stuff and break break fi done