bash - 在带有变量的bash中,shell 测试全局是否有匹配

  显示原文与译文双语对照的内容
139 1

我正在尝试这个问题中建议的答案:测试一个地球仪是否在bash中有任何匹配。

if test -n"$(find. -maxdepth 1 -name 'glob*' -print -quit)"
then
 echo found
else
 echo not found
fi

但是,我是在一个带有变量的脚本中进行的。

#!/bin/sh
directory=~/nd
glob="*12*.idx"
cd $directory
if test -n"$(find. -maxdepth 1 -name "$glob" -print -quit)"
then
 echo found
else
 echo not found
fi

运行脚本会给我:

not found

但我自己运行命令

find. -maxdepth 1 -name"*12*.idx" -print -quit

给了我一个结果

./notes_archive_2012.idx

这是引文问题?

时间:原作者:0个回答

60 3

是,这是引用问题。引号不应该在 $(...) 里面转义。请考虑:

test -n"$(find. -maxdepth 1 -name"$glob" -print -quit)" # Wrong

在上面的表单中,find 看到的-name的参数开始并以双引号的形式结束。如果文件名本身开始并以双引号结尾,它将只使用 MATCH 文件名。

以下是你所需的内容:

test -n"$(find. -maxdepth 1 -name"$glob" -print -quit)" # Right

来自 man bash:

在使用 $(command) 窗体时,括号之间的所有字符都构成该命令;没有特殊处理。

换句话说,如果你想要在 $(...) 内的命令中使用双引号,只需使用双引号。应该写入 $(...) 内的命令,就像它自己在 命令行 上输入的那样。

原作者:
...