Shell變數
變數-name
主要是find
我正在嘗試從數組中任意數量的字元串構造命令的複合
-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 "$@"