查找命令参数 -iname 对变量不起作用



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" {} ; 

等。

当你完整输入它时:

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" '{}' ;
你可以

只使用bash -c

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

或者最好使用 BASH 数组

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

相关内容

  • 没有找到相关文章

最新更新