查找:用变量替换表达式

查找:用变量替换表达式
$ 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,则两次尝试都会导致错误,因为findas-name不会被赋予模式(shell 将删除不匹配的模式)。

(在zshshell 中,您会收到错误,find因为它不知道什么选项-name "Bie*",即整个字符串, 是;这是因为zsh默认情况下 shell 不会对未加引号的扩展执行这些 split-and-glob 操作。)

相反,如果您使用的是具有数组的 shell,请使用

a=( -name 'Bik*' )
find . "${a[@]}"

find当按照此处所示的方式使用时,这将正确引用每个单独的单词。

或者,你可以使用

a='Bik*'
find . -name "$a"

有关的:

下半场我的解决方案在函数内部设置 -f

相关内容