Bash以命令退出代码为条件

时间:2013-08-19 16:23:31

标签: bash

在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

3 个答案:

答案 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。