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

如何在bash if/else语句中使用文件grep比较?,bash,Bash,当我们的服务器启动时,我们需要检查一个文件以查看服务器是如何配置的 我们希望在/etc/aws/hosts.conf文件中搜索以下字符串: MYSQL_ROLE=master 然后,我们要测试该字符串是否存在,并根据该字符串是否存在,使用if/else语句运行两个选项之一 if语句的BASH语法是什么 if [ ????? ]; then #do one thing else #do another thing fi 如果接受命令并检查其返回值[只是一个命令 if grep -q .

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

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

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

if语句的BASH语法是什么

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

如果
接受命令并检查其返回值<代码>[只是一个命令

if grep -q ...
then
  ....
else
  ....
fi
grep--help
,还可以看到:

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

您可能希望使用更具体的正则表达式,例如
^MYSQL\u ROLE=master$
,以避免注释中出现仅以“master”开头的字符串

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

只需使用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"
读取时-r行
做
大写“$line”
*MYSQL_ROLE=master*)
回声“做你的事”;;
*)回声“不存在”;;
以撒

完成注意,对于
管道
是任何命令或命令序列,则:

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内置†是
测试expr
的简写

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

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 
注意
-l
的使用,它只关心至少有一个匹配项的文件(因此
grep
在找到一个匹配项后立即返回,而不必继续解析输入文件。)


†在某些平台上,
[expr]
不是内置的,而是一个实际的可执行文件
/bin/[/code>(其最后一个参数将是
]
),这就是为什么
[expr]
应该在方括号中包含空格的原因,以及为什么它后面必须有空格(
&
|
|
&
,换行符)
-l
是多余的,
grep
在找到任何与
-q
>匹配的项时立即返回,零表示真,非零表示假,这与shell解释其他返回代码的方式相同,与C语言相反。但为什么相反呢?因为零通常被解释为“无错误”,而其他任何内容都表示“某些错误”。假设我们想知道命令是否成功完成。
if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi