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