从bash脚本调用grep
我不熟悉bash脚本(以及*nix shell),但我正在尝试编写此脚本,以便更轻松地生成代码库 这是我写的从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
#!/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
”选项假定您正在使用GNUgrep
,并确保即使路径名中有空格或其他意外字符,脚本也能工作。像这样使用xargs
比为每个文件执行find
更有效;/dev/null
出现在参数列表中,因此grep
始终报告包含匹配项的文件名
您可能会决定使用egrep
或grep-E
将所有搜索合并为一个搜索,从而简化生活。一种优化方法是捕获find
的输出一次,然后在每次迭代时将其馈送到xargs
。看看脚本,它可能会给您一些指针如果您只是想要一个更好的grep,而不想自己做任何事情,请使用ack,您可以找到它。没有理由使用backticks(或OP脚本中首选的$()
)或到目前为止在answers中发布的任何版本中。如果他将结果赋值给变量或将其作为另一个命令的参数使用,则情况会有所不同。在迭代命令行参数时,您也可以省略“$@”,并将其写成“for arg;do…”PS:您可以使用for arg来删除一行:这是“$@”
中的for arg的快捷方式。