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


138

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

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

MYSQL_ROLE=master

然后,我们要测试该字符串是否存在,并使用if / else语句根据该字符串是否存在运行两个选项之一。

if语句的BASH语法是什么?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi

Answers:


205

grep --help,还可以看到man grep

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

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

您可能要使用更特定的正则表达式,例如^MYSQL_ROLE=master$,以避免注释中的字符串,仅以“ master”开头的名称等。

之所以起作用,是因为if接受命令并运行该命令,并使用该命令的返回值来决定如何继续执行,零表示true,非零表示false,这与shell解释其他返回代码的方式相同,与C之类的语言相反。


>,零表示true,非零表示false,这与shell解释其他返回码的方式相同,并且与C之类的语言相反,但是为什么相反....?
kchoi

因为零通常被解释为“无错误”,而其他任何内容都意味着“某些错误”。如果假设我们想知道命令是否成功完成。
timelmer '18


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 

记录下来,[ expr ]是shell内置的简写test expr

由于grep在匹配的情况下返回状态为0,在不匹配的情况下返回非零状态,因此可以使用:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

请注意,使用-l后者仅关心文件是否具有至少一个匹配项(以便grep在找到一个匹配项后立即返回,而不必继续解析输入文件。)

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


4
-l是多余的,grep找到与的任何匹配项后立即返回-q
恢复莫妮卡请

3

只是用bash

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.