$ find -name "Bik*"
./Biking
./Biking/Unsync/Biking.md.~6~
./Biking/Rendered/Biking.gen.html
./Biking/Biking.md
现在,当我用变量替换表达式时,如下所示:
$ a='-name "Bik*"'
$ find $a
我没有得到任何输出。为什么会这样呢?以及应该修改什么?
答案1
(除非您用作zsh
交互式 shell...)问题是双引号将被视为模式的一部分。您实际运行的命令相当于
find . -name '"Bik*"'
得到这个是因为 shell 会对未加引号的 执行分词$a
,将字符串分割为两个单词-name
和"Bik*"
。然后,这些单词会生成文件名(“globbing”),这意味着它将"Bik*"
扩展到当前目录中与该特定模式匹配的所有文件名(包括双引号)。您不太可能有任何此类文件名,因此模式保持未展开,并且引号保留。
如果你用过的话a='-name Bik*'
,就会有工作过Bik*
,但前提是当前目录中没有任何匹配项。
如果在 中bash
使用了shopt -s nullglob
,则两次尝试都会导致错误,因为find
as-name
不会被赋予模式(shell 将删除不匹配的模式)。
(在zsh
shell 中,您会收到错误,find
因为它不知道什么选项-name "Bie*"
,即整个字符串, 是;这是因为zsh
默认情况下 shell 不会对未加引号的扩展执行这些 split-and-glob 操作。)
相反,如果您使用的是具有数组的 shell,请使用
a=( -name 'Bik*' )
find . "${a[@]}"
find
当按照此处所示的方式使用时,这将正确引用每个单独的单词。
或者,你可以使用
a='Bik*'
find . -name "$a"
有关的:
还下半场的我的解决方案到在函数内部设置 -f