bash 脚本上的字符串比较问题

bash 脚本上的字符串比较问题

这个脚本运行正常

stat1=$(systemctl list-units --type=service | grep gravity | grep gcr | awk {'print $1'} | xargs systemctl status | grep Active | awk {'print $2'})
echo "$stat1"
if [ $stat1 == 'active' ]
then
  echo " >> Gravity service is running ..."
else
  echo " >> Gravity service not running ..."
fi

这个不是

stat2=$(gravity status | grep status | awk {'print $3'})
echo "$stat2"
if [ $stat2 == 'active' ]
then
  echo " >> Gravity service is running ..."
else
  echo " >> Gravity service not running ..."
fi

统计2脚本

它们之间的唯一区别是此脚本上 stat 变量的输入是白色,而另一个是绿色。我还尝试使用 if [[ ]] ,并将 stat var 的 '' 更改为 "" ,这些都不起作用请帮助我了解如何使其工作。

尝试过这个:

在此输入图像描述

结果保持不变。

答案1

我强烈建议您使用以下is-active查询systemctl

systemctl is-active gravity

返回当前服务状态,或者:

sytemctl --quiet is-active gravity

0如果处于活动状态且非零,则退出,这意味着您可以使用

if sytemctl --quiet is-active gravity; then
  echo " >> Gravity service is running ..."
else
  echo " >> Gravity service not running ..."
fi

来自手动的

处于活动模式...

检查是否有任何指定的单元处于活动状态(即正在运行)。如果至少有一个处于活动状态,则返回退出代码 0,否则返回非零。除非指定 --quiet,否则这也会将当前单元状态打印到标准输出。


现在谈谈问题本身:

绿色作为字符串的一部分传递,因此匹配失败。与此比较:

if [ "$(echo 1 | grep --color=yes 1)" = 1 ]
then echo equal
else echo different
fi
#different

if [ "$(echo 1 | grep --color=no 1)" = 1 ]
then echo equal
else echo different
fi
#equal

看看第一种情况有何不同,而第二种情况则相同,因为[ stra == strb ]测试确切地匹配字符串。

您可以通过进行正则表达式匹配来避免此问题

if [[ $(echo 1 | grep --color=yes 1) =~ 1 ]]
then echo equal
else echo different
fi
#equal

但请注意,正则表达式可能与颜色编码匹配(但不包括“active”等单词的情况)。请注意这如何需要[[ ]]来自 的扩展测试bash

有些程序足够聪明,不会将颜色转发到管道,例如grep,但有人可能会强制它:

echo 1 | grep 1 | cat -A
1$
echo 1 | grep 1 --color=yes | cat -A
^[[01;31m^[[K1^[[m^[[K$

这就是1粗红色的着色效果。更多关于在这里重击颜色

相关内容