Bash
Bash:萬用字元和文件條件
我正在嘗試檢查文件是否存在:這按預期工作:
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
改用。