当我们的服务器启动时,我们需要检查文件以查看服务器的配置方式。
我们想在/etc/aws/hosts.conf文件中搜索以下字符串:
MYSQL_ROLE=master
然后,我们要测试该字符串是否存在,并使用if / else语句运行两个选项之一,具体取决于字符串是否存在。
if语句的BASH语法是什么?
if [ ????? ]; then
#do one thing
else
#do another thing
fi
答案 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"