2014-02-18 72 views
1

find命令的參數運行,當它在一個變量find命令參數-iname不會變

iname="-iname '*py'" 
echo iname: $iname 

正在使用不工作-iname不會從腳本工作:

find . $iname -exec grep "text" {} \; 

作品:

find . -iname '*py' -exec grep "text" {} \; 

編輯

解決方案:

我跟着@ chepner的解釋,在我的現實世界的腳本這樣做(這比使用數組從我的角度看更具可讀性)

inamecmd=-iname 
inamearg=*py 
find . $inamecmd $inamearg -exec grep "text" {} \; 

+0

,問題是「爲什麼」和「怎麼使其工作」 ... –

回答

2

當你完整的鍵入出來:

find . -iname '*py' -exec grep "text" {} \; 

bash使用單引號認識到,要在文本字符串*.py作爲參數傳遞給find。然後刪除單引號; find沒有看到它們。

當你使用一個變量:

iname="-iname '*py'" 
find . $iname -exec grep "text" {} \; 

bash擴展$iname的文字串-iname '*py',但刪除單引號。 find接收字符串'*py'作爲參數,因此只匹配以單引號開頭並以py'結尾的文件。

引用的iname擴張不會幫助:

find . "$iname" -exec grep "text" {} \; 

這一次,find將獲得作爲單個參數字符串-iname '*py',而不是兩個獨立的參數-iname'*py'bash只執行一輪報價清除;它不會再對參數擴展的結果這樣做。

在單變量多參數傳遞給命令的正確方法是使用一個數組:

iname=(-iname "*py") 
find . "${iname[@]}" -exec grep "text" '{}' \; 
+0

感謝你 - 我編輯了我的問題 –

0

您可以使用bash -c

bash -c "find . $iname -exec grep "text" {} \;" 

O [R 更好地利用BASH陣列

iname=("-iname" "*sh") 
find . "${iname[@]}" -exec grep "text" {} \;