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

0 linux scripting bash shell-script

这个脚本运行正常

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
Run Code Online (Sandbox Code Playgroud)

这个不是

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
Run Code Online (Sandbox Code Playgroud)

统计2脚本

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

尝试过这个:

在此输入图像描述

结果保持不变。

Fel*_*xJN 6

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

\n
systemctl is-active gravity\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
sytemctl --quiet is-active gravity\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
systemctl is-active gravity\n
Run Code Online (Sandbox Code Playgroud)\n

从手册中:

\n
\n

处于活动状态 PATTERN\xe2\x80\xa6

\n

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

\n
\n
\n

现在谈谈问题本身:

\n

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

\n
if [ "$(echo 1 | grep --color=yes 1)" = 1 ]\nthen echo equal\nelse echo different\nfi\n#different\n\nif [ "$(echo 1 | grep --color=no 1)" = 1 ]\nthen echo equal\nelse echo different\nfi\n#equal\n
Run Code Online (Sandbox Code Playgroud)\n

看看它在第一种情况下有何不同,在第二种情况下有何相同,因为[ stra == strb ]测试了完全匹配的字符串。

\n

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

\n
if [[ $(echo 1 | grep --color=yes 1) =~ 1 ]]\nthen echo equal\nelse echo different\nfi\n#equal\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
echo 1 | grep 1 | cat -A\n1$\necho 1 | grep 1 --color=yes | cat -A\n^[[01;31m^[[K1^[[m^[[K$\n
Run Code Online (Sandbox Code Playgroud)\n

1这就是粗红色的着色效果。有关bash 颜色的更多信息请参见此处。

\n

  • @Eyalu 颜色实际上是一组不可见的控制字符,它们是字符串中数据的一部分。这意味着如果不先删除颜色(或者更好的是,甚至不首先添加颜色),就无法比较字符串。 (5认同)