bash + 将变量与空格进行比较

bash + 将变量与空格进行比较

我想打印防火墙-cmd--状态变量中的状态 - $STAT

然后将变量 $STAT 与“not running”字符串进行比较

但是比较得到 false ,这是因为变量内部有空格

请建议如何做到 bash 定期过期

所以我将检查变量中是否包含“未运行”,以便通过 echo 打印“未运行”

#  firewall-cmd --state
   not running
   STAT=` firewall-cmd --state `
   echo $STAT
   not running
   [[ $STAT = "not running" ]] && echo "not running"

   no output 

答案1

这工作得很好:

$ stat=$(echo "not running")
$ [[ $stat = "not running" ]] && echo yes
yes

但是,如果变量中有前导或尾随空格,则它不起作用。但是您可以使用模式匹配或正则表达式匹配来覆盖:

$ stat=$(echo " not running ")
$ [[ $stat = *"not running"* ]] && echo yes
yes
$ [[ $stat =~ "not running" ]] && echo yes
yes

两者都在变量中搜索字符串not running。第一个中的星号明确表示前导或尾随字符。第二个是正则表达式匹配,默认情况下在字符串中的任何位置查找匹配项。

要使用正则表达式显式匹配前导或尾随空格,最简单的方法是将正则表达式放入变量中。$pattern必须是未引用的在有条件的情况下。

$ pattern="^ *not running *$"
$ [[ $stat =~ $pattern ]] && echo yes
yes

(我假设这里只有可能的额外空格字符,而不是任意空格。)

答案2

您需要使用引号。

如果输出为firewall-cmd --statenot running则该命令STAT=$( firewall-cmd --state )会将变量设置STAT为字符串not,然后尝试执行running

你想做的是:

STAT="$( firewall-cmd --state )"

您可以一次完成所有这些操作,而无需使用变量:

if [[ "not running" = "$( firewall-cmd --state )" ]]; then
    echo "It's not running"
else
    echo "It's running"
fi

相关内容