如何将shell通配符传递给反引号命令

时间:2011-04-01 08:27:16

标签: shell wildcard backticks

我试图在shell脚本中使用find来计算我匹配通配符模式的文件数,然后获取文件名(如果只有一个)。但是我无法将通配符模式传递给反向扩展。

FINDCMD="find . -iname *DATA*.txt"
DATACOUNT=$($FINDCMD | wc -l)

if [ $DATACOUNT -eq 1 ]
then
  use-data $($FINDCMD)
else
  echo bugger
fi

这不起作用:shell在调用find时展开 DATA .txt。我希望传递星号来找到。

如果我做到了

FINDCMD="find . -iname '*DATA*.txt'"

然后shell不会扩展星号,但是find会得到单引号并且什么都不匹配。

3 个答案:

答案 0 :(得分:1)

不要将命令放在变量中。直接执行命令有什么问题?

DATACOUNT=$(find . -iname "*DATA*.txt" | wc -l)
if [ $DATACOUNT -eq 1 ];then
    .....
fi

编辑:

如果您想重复使用该命令,请使用子程序

myfind(){
    find . -iname "*DATA*.txt" | wc -l
}

答案 1 :(得分:1)

以下几点:

  1. 在find命令中使用引号:FINDCMD="find . -iname \"*DATA*.txt\""FINDCMD='find . -iname "*DATA*.txt"'
  2. 在脚本开头使用以下bash选项:-f Disable pathname expansion.,如下所示set -f
  3. 这应该可以解决问题。虽然没有在你的脚本上测试过,但你应该从这一点上得到这个想法。

答案 2 :(得分:-1)

切换单引号和双引号。

尝试:

FINDCMD='find . -iname "*DATA*.txt"'