2015-04-12 127 views
1

我是bash的总noob,所以这很可能是语法错误,但我找不到任何在我的搜索中用于我的语法的东西。bash脚本 - 执行find命令不会输出

从终端,运行
find . -name "*g*"
结果

./.grepdir.sh.swp 
./grepdir.sh 

但是,运行称为grepdir.sh

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

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

从终端作为grepdir.sh . "*g*"结果这个bash脚本在:

[[email protected]~/dir]$ grepdir.sh . "*g*" 
find . -name "*g*" 

[[email protected]~/dir]$ 

这意味着cmd必须为空。但根据我的理解,存储在find_cmd中的字符串已执行并且输出捕获到cmd,这意味着它不应该为空。我有错误观念,还是我的语法太糟糕了?

感谢

+0

使用'CMD = $(bash -c“$ find_cmd”)似乎解决了这个问题。但我不明白你不工作的原因。 – tivn

回答

1

与你的脚本版本的问题是,你加引号实际上已经成为寻找论据的一部分。所以你要求它搜索包含"*g*"以及引号的文件名。

如果您放弃添加引号并且只是说find_cmd="find $startdir -name $pattern";,那么它适用于不包含特殊字符的模式。后来我想,也许这会工作:

grepdir.sh . \*g\* 

甚至

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

,但没有。这些事总是棘手....

编辑:A-HA,这个版本似乎工作:

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

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

你不用C语言编写代码,因此没有理由使用';'元字符来结束每一行。 – user3439894

+0

对,我没有注意到,我只是复制原件。但我没有添加一个;到我添加的额外行。 :-) –

+0

+1。但真正的答案只是[不要把命令和参数放在一个变量中](http://mywiki.wooledge.org/BashFAQ/050) – BroSlow

0

我通常做这种方式 - >

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

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