我是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 $
我该如何正确地做到这一点?
而且,我认为一个更重要的问题是,如何让grep像这样通过子目录进行递归呢?
使用shell脚本和使用bash的任何其他提示和/或陷阱也将受到赞赏。
答案 0 :(得分:9)
语法错误是因为您遗漏了do
。至于如果您的grep
具有-R
选项,则递归搜索:
#!/bin/bash
for arg in "$@"; do
grep -R "$arg" *
done
否则您可以使用find
:
#!/bin/bash
for arg in "$@"; do
find . -exec grep "$arg" {} +
done
在后一个示例中,find
将执行grep
并将{}
大括号替换为它找到的文件名,从当前目录.
开始。
(请注意,我还将arg
更改为"$arg"
。您需要使用美元符号来获取变量的值,并且引号会告诉shell将其值视为一个大词,即使{ {1}}包含空格或换行符。)
答案 1 :(得分:3)
关于递归grepping:
根据您的grep版本,您可以将-R传递给grep命令,让它以递归方式搜索(在子目录中)。
答案 2 :(得分:1)
上面列出了最佳解决方案,但请尝试将您的陈述放在后面:
`grep ...`
答案 3 :(得分:1)
你应该使用'find'加'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
。
答案 4 :(得分:0)
查看findrepo脚本,它可能会给你一些指示
答案 5 :(得分:0)
如果你只想要一个更好的grep并且不想自己做任何事情,请使用ack,你可以在http://betterthangrep.com/获得。