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