在bash中,我想说“如果文件不包含XYZ,那么”做一堆事情。将此转换为代码的最自然方式是:
if [ ! grep --quiet XYZ "$MyFile" ] ; then
... do things ...
fi
但当然,这不是有效的Bash语法。我可以使用反引号,但之后我将测试文件的输出。我能想到的两个选择是:
grep --quiet XYZ "$MyFile"
if [ $? -ne 0 ]; then
... do things ...
fi
和
grep --quiet XYZ "$MyFile" ||
( ... do things ...
)
我更喜欢第二种,它更像是Lispy和||控制流程在脚本语言中并不常见。我也可以看到第一个参数,尽管当这个人读第一行时,他们不知道为什么你正在执行grep,看起来你正在执行它的主要效果,而不仅仅是控制脚本中的分支。
是否有第三种更直接的方式使用if
语句并且条件中包含grep
?
答案 0 :(得分:28)
是的,有:
if grep --quiet .....
then
# If grep finds something
fi
或者如果grep失败
if ! grep --quiet .....
then
# If grep doesn't find something
fi
答案 1 :(得分:9)
您不需要[
]
(test
)来检查命令的返回值。试试吧:
if ! grep --quiet XYZ "$MyFile" ; then
答案 2 :(得分:2)
这是一个品味问题,因为显然有多种工作方案。当我处理这样的问题时,我通常在grep之后应用wc -l
来计算匹配的行数。然后,您可以在测试条件下评估一个整数。如果问题只是是否存在匹配(匹配行的数量无关紧要),那么应用wc
可能是OTT并且grep
的返回码的评估似乎是最好的溶液:
通常,如果找到选定的行,则退出状态为0,为1 除此以外。但是如果发生错误,退出状态为2,除非 使用-q或--quiet或--silent选项并找到选定的行。但请注意,对于像grep这样的程序,POSIX仅强制要求 cmp和diff,出错时的退出状态大于 1;因此,为便于携带,建议使用 测试这种一般条件而不是严格相等的逻辑 用2。