Find
查找:用變數替換錶達式
$ find -name "Bik*" ./Biking ./Biking/Unsync/Biking.md.~6~ ./Biking/Rendered/Biking.gen.html ./Biking/Biking.md
現在,當我用變數替換錶達式時,如下所示:
$ a='-name "Bik*"' $ find $a
我沒有輸出。為什麼會這樣?應該修改什麼?
(除非您將
zsh
其用作互動式外殼……)問題是雙引號將被視為模式的一部分。您實際執行的命令相當於find . -name '"Bik*"'
你得到這個是因為 shell 會對 unquoted 執行分詞
$a
,將字元串拆分為兩個單詞-name
and"Bik*"
。然後這些單詞會進行文件名生成(“globbing”),這意味著"Bik*"
將擴展為與目前目錄中的特定模式匹配的所有文件名(包括雙引號)。您不太可能有任何此類文件名,因此該模式保持未擴展,並且引號仍然存在。如果您使用過
a='-name Bik*'
,它會起作用,但前提是您Bik*
在目前目錄中沒有任何匹配項。如果在 中
bash
,您使用了shopt -s nullglob
,則兩次嘗試都會導致錯誤,find
因為-name
不會給出模式(shell 會刪除不匹配的模式)。(在
zsh
shell 中,你會得到一個錯誤,find
因為它不知道 option 是什麼-name "Bie*"
,即整個 string;這是因為zsh
預設情況下,shell 不對不帶引號的擴展執行這些拆分和全域操作。)相反,如果您使用的是具有數組的外殼,請使用
a=( -name 'Bik*' ) find . "${a[@]}"
find
當以此處顯示的方式使用 with 時,這將正確引用每個單獨的單詞。或者,您可以使用
a='Bik*' find . -name "$a"
有關的:
也是我在函式內部設置 -f的解決方案的後半部分