如何在bash if / else语句中使用grep比较文件?
当我们的服务器出现时,我们需要检查一个文件来查看服务器是如何configuration的。
我们要在我们的/etc/aws/hosts.conf文件中search下面的string:
MYSQL_ROLE=master
然后,我们要testing该string是否存在,并根据string是否存在使用if / else语句来运行两个选项之一。
if语句的BASH语法是什么?
if [ ????? ]; then #do one thing else #do another thing fi
从grep --help
,也看man grep :
如果select任何行,则退出状态为0,否则为1; 如果发生任何错误,并且没有给出-q,退出状态是2。
if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then echo exists else echo not found fi
您可能希望使用更具体的正则expression式(例如^MYSQL_ROLE=master$
)来避免注释中的string,仅以“master”开头的名称等。
这是有效的,因为if需要一个命令并运行它,并使用该命令的返回值来决定如何继续,其中0表示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), eg error fi
为了logging, [ expr ]
是一个shell内置的†简写为test expr
。
由于grep
在匹配的情况下返回状态0,如果不匹配则返回非零状态,可以使用:
if grep -lq '^MYSQL_ROLE=master' ; then # do one thing else # do another thing fi
请注意,使用-l
只关心至less有一个匹配的文件(这样grep
只要find一个匹配就返回,而不必不必要地继续parsinginput文件)。
† 在某些平台上[ expr ]
不是内build的,而是一个实际的可执行文件/bin/[
(它的最后一个参数是) ]
,这就是为什么[ expr ]
应该包含方括号周围的空格,为什么必须跟随其中一个命令列表分隔符 ( ;
, &&
, ||
, |
, &
,newline)
尝试:
if [ -n "`grep \"MYSQL_ROLE=master\" /etc/aws/hosts.conf`" ]; then
只需使用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"