Bash

Bash:萬用字元和文件條件

  • October 21, 2019

我正在嘗試檢查文件是否存在:這按預期工作:

if [ -e "/tmp/test.*.lock" ]; then
 echo "exists!"
fi

這不會:

if [[ -e /tmp/test.*.lock ]]; then
 echo "exists!"
fi

文件名可能類似於 /tmp/test.123.lock

我找不到使它與“[[”版本一起使用的方法。有人可以解釋一下為什麼以及如何使它工作嗎?

[[使用者 xenoid us 對,表達式中不會發生路徑名擴展。

從 bash 手冊頁:

[[ expression ]]

根據條件表達式表達式的計算返回狀態 0 或 1。表達式由下面描述的基本元素組成CONDITIONAL EXPRESSIONS和之間的單詞不進行分詞和路徑名[[擴展]];執行波浪號擴展、參數和變數擴展、算術擴展、命令替換、程序替換和引號刪除。諸如-f必須不加引號的條件運算符才能被辨識為主要運算符。

(強調我的)

要使用[[測試,您需要在實際測試之前進行擴展。這可以通過一個數組來儲存生成的文件名來完成。

下面是兩個範例:第一個測試一個匹配文件,第二個測試至少一個匹配文件,如果找到匹配項,則退出循環。

files=( /tmp/test.*.lock )

# test if exactly one file matches
if [[ "${#files[@]}" -eq 1 ]] && [[ -e "${files[0]}" ]]; then
 echo "file ${files[0]} exists!"
fi

# test if at least one file matches
for f in "${files[@]}"; do
 if [[ -e "$f" ]]; then
   echo "at least one file exists!"
   break
 fi
done

請注意,表達式中的變數不需要引號[[,但這樣做並沒有什麼壞處,您可以替換[[[. 如果您知道您的鎖定文件是正常文件,請-f改用。

引用自:https://unix.stackexchange.com/questions/547931