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