Shell

變數-name主要是find

  • July 17, 2018

我正在嘗試從數組中任意數量的字元串構造命令的複合-name主,格式為. 雖然在終端中顯式鍵入名稱 primary 是可行的,但將其儲存在變數中並通過參數擴展呼叫它卻不起作用。由於擴展將在執行之前發生,我認為問題與擴展變數的引用有關。find``\( -name ${a[0]} -or -name ${a[1]} -or -name ${a[2]} ... \)``find

下面是 n=2 名稱的最小範例,可以按字面輸入或從變數中呼叫。雖然我意識到我可以通過管道傳輸到,但在這種情況下grep,我更願意做所有事情。find

$ ls
a1  a2  b1  b2  c1  c2

$ find . \( -name a\* -or -name b\* \)
./a1
./a2
./b1
./b2

$ names="\( -name a\* -or -name b\* \)"

$ printf "%s\n" "$names"
\( -name a\* -or -name b\* \)

$ find . $(printf "%q" "$names")
find: -name\: unknown primary or operator

$ find . $(printf "%s" "$names")
find: \): unknown primary or operator

$ find . $names
find: \): unknown primary or operator

$ find . "$names"
find: \( -name a\* -or -name b\* \): No such file or directory

每個-name,每個-or,每個括號和每個模式都必須是一個單獨的參數find。不要用空格連接參數:你不能從那裡回到參數列表——你怎麼知道哪些空格用來分隔參數,哪些空格是參數的一部分?另請參閱為什麼我的 shell 腳本會因空格或其他特殊字元而窒息?

如果您的 shell 支持數組(ksh、bash、zsh),請將參數列表儲存在數組中。

names=(\( -name a\* -or -name b\* \))
…
find "${names[@]}"

如果您的 shell 不支持數組,您可以在位置參數中構造列表(您可以訪問的參數為$1, $2, …)。明顯的限制是您不能將位置參數用於其他目的。

set -- \( -name a\* -or -name b\* \)
…
find "$@"

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