Bash脚本 - 执行查找命令没有输出

3
我对bash完全不熟,所以这很可能是语法错误,但我在搜索中没有找到适用于我的语法的任何内容。
从终端运行以下命令:
find . -name "*g*"
结果为:
./.grepdir.sh.swp  
./grepdir.sh

然而,运行名为grepdir.sh此bash脚本
#!/usr/bin/bash
startdir="$1";
pattern="$2";
find_cmd="find $startdir -name \"$pattern\"";
echo "$find_cmd";

cmd="$($find_cmd)";
echo "$cmd";

在终端输入grepdir.sh . "*g*"会得到以下结果:

[user@pc~/dir]$ grepdir.sh . "*g*"
find . -name "*g*"

[user@pc~/dir]$

这意味着cmd必须为空。但是从我的理解来看,存储在find_cmd中的字符串被执行并输出被捕获到cmd中,这意味着它不应该为空。我是否有误解,还是我的语法太可怕了?

谢谢


使用 cmd=$(bash -c "$find_cmd") 似乎可以解决这个问题。但我不明白为什么你的方法不起作用。 - tivn
2个回答

2
您的脚本版本存在问题,因为您添加的引号实际上成为查找参数的一部分。因此,您要求它搜索包含带引号的"*g*"文件名。
如果您不添加引号,只是说find_cmd="find $startdir -name $pattern";,那么它适用于不包含特殊字符的模式。然后我想也许这个会起作用:
grepdir.sh . \*g\*

甚至更多

grepdir.sh . \\\*g\\\*

但是这些事情总是很棘手的...

编辑:啊哈,这个版本似乎可以工作:

#!/usr/bin/bash
startdir="$1";
pattern="$2";
find_cmd="find $startdir -name $pattern";
echo "$find_cmd";

GLOBIGNORE=$pattern
cmd="$($find_cmd)";
echo "$cmd";

1
你不是在编写C代码,因此没有实际理由使用;元字符来结束每一行。 - user3439894
没错,我没有注意到这一点,只是复制了原来的代码。但是我没有在我添加的额外行中加上分号。 :-) - Bjorn Munch
+1。但真正的答案是:不要将命令和参数放在变量中 - Reinstate Monica Please
经过更多的思考,我认为问题出在通配符上。谢谢! - user3915191

0

我通常是这样做的 -->

#!/bin/bash
dir=$1
file="*$2*"
find $dir -iname $file -print

你应该包含代码解释。描述代码如何以及为什么解决问题更有用,因为它可以帮助提问者和其他读者自己解决这个问题和类似的问题。 - Anthony Geoghegan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接