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

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

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

MYSQL_ROLE=master

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

If 语句的 BASH 语法是什么?

if [ ????? ]; then
#do one thing
else
#do another thing
fi
234629 次浏览

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

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

来自 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”开头的名称等。

这是因为 如果接受一个命令并运行它,并使用该命令的返回值来决定如何继续,0表示 true,非0表示 false & mash; 与 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"

注意,如果 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 ]应该在方括号周围包含空格,以及为什么它后面必须跟着 命令列表分隔符之一(;&&|||&,换行)

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

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