【问题标题】:How do I use a file grep comparison inside a bash if/else statement?如何在 bash if/else 语句中使用文件 grep 比较?
【发布时间】:2011-01-29 15:36:26
【问题描述】:

当我们的服务器启动时,我们需要检查一个文件以查看服务器是如何配置的。

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

MYSQL_ROLE=master

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

if 语句的 BASH 语法是什么?

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

【问题讨论】:

    标签: bash


    【解决方案1】:

    来自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$,以避免在 cmets、仅以“master”开头的名称等中使用该字符串。

    之所以有效,是因为 if 接受一个命令并运行它,并使用该命令的返回值来决定如何继续,零表示真,非零表示假——与shell 如何解释其他返回码,与 C 等语言相反。

    【讨论】:

    • > 零表示真,非零表示假——与 shell 解释其他返回码的方式相同,与 C 等语言相反。但为什么相反...... ?
    • 因为零通常被解释为“没有错误”,而其他任何东西都意味着“一些错误”。如果假设我们想知道命令是否成功完成。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      注意,对于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 ] 应该方括号周围包含空格,以及为什么后面必须跟one of the command list separators;&&|||&、换行符)

      【讨论】:

      • -l 是多余的,grep 在找到与-q 的任何匹配项后立即返回
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        下面的代码示例应该可以工作:

        (echo "hello there" | grep -q "AAA") && [ $? -eq 0 ] && echo "hi" || echo "bye"
        

        【讨论】:

          猜你喜欢
          • 2022-11-16
          • 1970-01-01
          • 2019-10-15
          • 2022-01-09
          • 2018-07-10
          • 1970-01-01
          • 2016-01-21
          • 2021-03-06
          相关资源
          最近更新 更多