如何在bash if/else语句中使用文件grep比较?

use*_*413 130 bash

当我们的服务器启动时,我们需要检查文件以查看服务器的配置方式.

我们想在/etc/aws/hosts.conf文件中搜索以下字符串:

MYSQL_ROLE=master
Run Code Online (Sandbox Code Playgroud)

然后,我们要测试该字符串是否存在,并使用if/else语句运行两个选项之一,具体取决于字符串是否存在.

if语句的BASH语法是什么?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi
Run Code Online (Sandbox Code Playgroud)

小智 196

grep --help,也见男人grep:

如果选择了任何行,则退出状态为0,否则为1; 如果发生任何错误且未给出-q,则退出状态为2.

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi
Run Code Online (Sandbox Code Playgroud)

您可能希望使用更具体的正则表达式,例如^MYSQL_ROLE=master$,避免注释中的字符串,仅以"master"开头的名称等.

这是因为if接受命令并运行它,并使用该命令的返回值来决定如何继续,零意味为真,非零意味着假 - 与shell如何解释其他返回代码相同,和C之类的语言相反


Ign*_*ams 31

if接受命令并检查其返回值.[只是一个命令.

if grep -q ...
then
  ....
else
  ....
fi
Run Code Online (Sandbox Code Playgroud)


vla*_*adr 23

请注意,对于PIPE任何命令或命令序列,则:

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 
Run Code Online (Sandbox Code Playgroud)

为了记录,[ expr ]是一个内置的速记test expr.

因为grep在匹配的情况下返回状态为0,而在没有匹配的情况下返回非零状态,您可以使用:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 
Run Code Online (Sandbox Code Playgroud)

注意其使用-l仅关注具有至少一个匹配的文件(因此grep一旦找到一个匹配就返回,而不必不必要地继续解析输入文件.)

在某些平台上[ expr ]是不是内置的,但实际的可执行文件/bin/[(其最后一个参数会]),这就是为什么[ expr ]应该包含前后的方括号的空白,以及为什么它必须遵循的命令列表分隔符的一个(;,&&,||,|,&, 新队)

  • `-l`是多余的,`grep`在找到与`-q`匹配时立即返回 (4认同)