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

当我们的服务器出现时,我们需要检查一个文件来查看服务器是如何configuration的。

我们要在我们的/etc/aws/hosts.conf文件中search下面的string:

MYSQL_ROLE=master 

然后,我们要testing该string是否存在,并根据string是否存在使用if / else语句来运行两个选项之一。

if语句的BASH语法是什么?

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

grep --help ,也看man grep :

如果select任何行,则退出状态为0,否则为1; 如果发生任何错误,并且没有给出-q,退出状态是2。

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

您可能希望使用更具体的正则expression式(例如^MYSQL_ROLE=master$ )来避免注释中的string,仅以“master”开头的名称等。

这是有效的,因为if需要一个命令并运行它,并使用该命令的返回值来决定如何继续,其中0表示true,非零表示false – 与shell解释其他返回码的方式相同,与C语言相反

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

 if grep -q ... then .... else .... fi 

请注意,对于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), eg error fi 

为了logging, [ expr ]是一个shell内置的简写为test expr

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

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

请注意,使用-l只关心至less有一个匹配的文件(这样grep只要find一个匹配就返回,而不必不必要地继续parsinginput文件)。

在某些平台上[ expr ]不是内build的,而是一个实际的可执行文件/bin/[ (它的最后一个参数是) ] ,这就是为什么[ expr ]应该包含方括号周围的空格,为什么必须跟随其中一个命令列表分隔符 ( ;&&|||& ,newline)

尝试:

 if [ -n "`grep \"MYSQL_ROLE=master\" /etc/aws/hosts.conf`" ]; then 

只需使用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"