这个脚本运行正常
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
它们之间的唯一区别是此脚本上 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
粗红色的着色效果。更多关于在这里重击颜色。