find命令参数-iname在变量中不起作用

时间:2014-02-18 12:49:21

标签: bash find

find命令参数-iname在变量

中使用时不起作用
iname="-iname '*py'"
echo iname:   $iname

不起作用:

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

工作的:

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

修改

解决方案:

我跟着@Chepner的解释,并在我的真实世界脚本中做到了这一点(从我的角度来看,它比使用数组更具可读性)

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

2 个答案:

答案 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" '{}' \;

答案 1 :(得分:0)

您可以使用bash -c

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

OR 更好地使用BASH数组

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