Find

查找:用變數替換錶達式

  • September 12, 2019
$ 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,將字元串拆分為兩個單詞-nameand "Bik*"。然後這些單詞會進行文件名生成(“globbing”),這意味著"Bik*"將擴展為與目前目錄中的特定模式匹配的所有文件名(包括雙引號)。您不太可能有任何此類文件名,因此該模式保持未擴展,並且引號仍然存在。

如果您使用過a='-name Bik*',它會起作用,但前提是您Bik*在目前目錄中沒有任何匹配項。

如果在 中bash,您使用了shopt -s nullglob,則兩次嘗試都會導致錯誤,find因為-name不會給出模式(shell 會刪除不匹配的模式)。

(在zshshell 中,你會得到一個錯誤,find因為它不知道 option 是什麼-name "Bie*",即整個 string;這是因為zsh預設情況下,shell 不對不帶引號的擴展執行這些拆分和全域操作。)

相反,如果您使用的是具有數組的外殼,請使用

a=( -name 'Bik*' )
find . "${a[@]}"

find當以此處顯示的方式使用 with 時,這將正確引用每個單獨的單詞。

或者,您可以使用

a='Bik*'
find . -name "$a"

有關的:

也是我在函式內部設置 -f解決方案後半部分

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