find我想管理變數中命令的檔案名模式的簡單情況:
/bin/bash
EXCLUDE="! \( -name "\"run*"\" -o -name "\"doc*"\" \)"
find . -maxdepth 1 -type f "$EXCLUDE"
期望是找到所有與$EXCLUDE模式不匹配的檔案。
盡管相同的模式直接按預期作業,但該方法不起作用。
在 shell 跟蹤模式下,我觀察到一些我認為是潛在根本原因的東西——$EXCLUDE變數在單引號之間進行評估:
set -x
find . -maxdepth 1 -type f "$EXCLUDE"
find . -maxdepth 1 -type f '! \( -name "run*" -o -name "doc*" \)'
find: paths must precede expression: ! \( -name "run*" -o -name "doc*" \)
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
替換$EXCLUDE變數出現在以開頭的行中 ,我的find命令不會回傳任何帶有這些字符的內容:'! \( -name "run*" -o -name "doc*" \)'。
有沒有辦法洗掉那些不屬于變數的引號,或者我錯過了更大的東西?
uj5u.com熱心網友回復:
這是BashFAQ/050——使用陣列代替:
EXCLUDE=( '!' '(' -name 'run*' -o -name 'doc*' ')' )
然后使用陣列擴展語法
find . -maxdepth 1 -type f "${EXCLUDE[@]}"
uj5u.com熱心網友回復:
將引數存盤在陣列中:
#! /bin/bash
EXCLUDE=( '!' '(' '-name' 'run*' '-o' '-name' 'doc*' ')' )
find . -maxdepth 1 -type f "${EXCLUDE[@]}"
這避免了參考錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/413739.html
標籤:
上一篇:回圈查詢的輸出
