如何在bash if/else语句中使用文件grep比较?
当我们的服务器启动时,我们需要检查一个文件以查看服务器是如何配置的 我们希望在/etc/aws/hosts.conf文件中搜索以下字符串:如何在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 .
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