从bash脚本调用grep

从bash脚本调用grep,bash,grep,Bash,Grep,我不熟悉bash脚本(以及*nix shell),但我正在尝试编写此脚本,以便更轻松地生成代码库 这是我写的 #!/bin/bash args=("$@"); for arg in args grep arg * */* */*/* */*/*/* */*/*/*/*; done 当我尝试运行它时,会发生以下情况: ~/Work/richmond $ ./f.sh "\$_REQUEST\['a'\]" ./f.sh: line 4: syntax error near unexpected

我不熟悉bash脚本(以及*nix shell),但我正在尝试编写此脚本,以便更轻松地生成代码库

这是我写的

#!/bin/bash
args=("$@");
for arg in args
 grep arg * */* */*/* */*/*/* */*/*/*/*;
done
当我尝试运行它时,会发生以下情况:

~/Work/richmond $ ./f.sh "\$_REQUEST\['a'\]" ./f.sh: line 4: syntax error near unexpected token `grep' ./f.sh: line 4: ` grep arg * */* */*/* */*/*/* */*/*/*/*;' ~/Work/richmond $ ~/Work/richmond$/f.sh“\$\u请求\['a'\]” ./f.sh:第4行:意外标记“grep”附近的语法错误 ./f.sh:第4行:`grep arg**/***/***/***/***/***/***/***/*/*/*/*;' ~/工作/里士满$ 我如何正确地做到这一点

我认为一个更重要的问题是,如何让grep像这样通过子目录正确地递归

对于shell脚本编写和一般使用bash的任何其他提示和/或陷阱,我们也将不胜感激。

关于递归grepping:


根据您的grep版本,您可以将-R传递给grep命令以使其递归搜索(在子目录中)。

语法错误是因为您缺少
do
。对于递归搜索,如果您的
grep
具有
-R
选项,您将执行以下操作:

#!/bin/bash
for arg in "$@"; do
   grep -R "$arg" *
done
否则,您可以使用
查找

#!/bin/bash
for arg in "$@"; do
   find . -exec grep "$arg" {} +
done
在后一个示例中,
find
将执行
grep
,并将
{}
大括号替换为找到的文件名,从当前目录
开始


(请注意,我还将
arg
更改为
“$arg”
。您需要美元符号来获取变量的值,引号告诉shell将其值视为一个大字,即使
$arg
包含空格或换行符。)

最好的解决方案如上所述,但请尝试将您的语句放在后面:

`grep ...`

您应该使用“查找”和“xargs”来进行文件搜索

for arg in "$@"
do
    find . -type f -print0 | xargs -0 grep "$arg" /dev/null
done
-print0
”和“
-0
”选项假定您正在使用GNU
grep
,并确保即使路径名中有空格或其他意外字符,脚本也能工作。像这样使用
xargs
比为每个文件执行
find
更有效;
/dev/null
出现在参数列表中,因此
grep
始终报告包含匹配项的文件名


您可能会决定使用
egrep
grep-E
将所有搜索合并为一个搜索,从而简化生活。一种优化方法是捕获
find
的输出一次,然后在每次迭代时将其馈送到
xargs

看看脚本,它可能会给您一些指针

如果您只是想要一个更好的grep,而不想自己做任何事情,请使用ack,您可以找到它。

没有理由使用backticks(或OP脚本中首选的
$()
)或到目前为止在answers中发布的任何版本中。如果他将结果赋值给变量或将其作为另一个命令的参数使用,则情况会有所不同。在迭代命令行参数时,您也可以省略“$@”,并将其写成“for arg;do…”PS:您可以使用
for arg来删除一行:这是“$@”
中的
for arg的快捷方式。