如何在 bash 中评估 grep 的结果?

如何在 bash 中评估 grep 的结果?

我想要 grep 某个服务的特定状态(tomcat8.service)。

只有找到字符串时我才想执行一些逻辑。

问题:即使我在不​​存在的服务名称上执行脚本(本例中为“asd”),if $status仍然匹配并打印出来。但为什么呢?

status = $(systemctl status asd.service | grep 'active')
echo $status

if $status
then 
    echo "$SERVICE was active"
    exit 0
fi 
exit 0

结果输出为:asd.service was active,这当然不是真的。

印刷品echo $statusstatus: Unknown job: =

答案1

您可以利用 grep 的返回状态。

systemctl status asd.service | grep 'active' \
    && status=active \
    || status=not_active

if [ "$status" == "active" ]; then
    [...]
fi

甚至更简单:

test $(systemctl status asd.service | grep 'active') \
    && echo "$SERVICE was active"

或者如果你愿意if

if $(systemctl status asd.service | grep 'active'); then
    echo "$SERVICE was active"
fi

无论如何,请注意关键词inactivenot activeactive (exited)alike。这也会与您的grep陈述相匹配。请参阅评论。感谢@Terrance 的提示。


更新:

不需要 grep。systemctl已包含命令is-active

systemctl -q is-active asd.service \
    && echo "$SERVICE was active"

或者:

if systemctl -q is-active asd.service; then
    echo "is active";
fi

答案2

一些代码审查意见:

  • sh/bash/ksh/zsh 变量分配看起来像var=value——不允许周围=有空格。(文档
  • status=$(some command)-- 状态变量保存输出命令的退出状态,而不是退出状态。退出状态在$?变量中
  • 声明if作用于后续命令的退出状态文档

    if some_comment; then action1; else action2; fi
    

    最常见的是,命令是[[[测试某些条件。

    但是,grep有一个明确的退出状态:如果找到了模式,则为 0,否则为 1。因此,您需要以下状态:

    if systemctl status asd.service | grep -q 'active'; then
        echo "$SERVICE was active"
    fi
    

相关内容