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

时间:2010-03-19 21:06:23

标签: bash

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

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

MYSQL_ROLE=master

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

if语句的BASH语法是什么?

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

4 个答案:

答案 0 :(得分:184)

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 接受命令并运行它,并使用该命令的返回值来决定如何继续,零意味着真,非零意味着假 - 就像shell如何解释其他返回码,与C语言相反。

答案 1 :(得分:31)

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

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

答案 2 :(得分:22)

请注意,对于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 ]是内置test expr简写。

由于grep在匹配的情况下返回状态0,并且在没有匹配的情况下返回非零状态,因此您可以使用:

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

请注意-l的使用,它只关心至少有一个匹配的文件(以便grep在找到一个匹配时立即返回,而不必不必要地继续解析输入文件。)

某些平台上的

[ expr ]不是内置的,而是实际的可执行文件/bin/[(其最后一个参数将是]),这就是[ expr ]应该在方括号周围包含空格的原因,以及one of the command list separators ;&&||,{{1}必须遵循的原因},|,换行符)

答案 3 :(得分: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"