Answers:
从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接受命令并运行该命令,并使用该命令的返回值来决定如何继续执行,零表示true,非零表示false,这与shell解释其他返回代码的方式相同,与C之类的语言相反。
if接受命令并检查其返回值。[只是一个命令。
if grep -q ...
then
....
else
....
fi
请注意,对于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 ]应该包含前后的方括号的空白,以及为什么它必须遵循的命令列表分隔符的一个(;,&&,||,|,&, 新队)
-l是多余的,grep找到与的任何匹配项后立即返回-q