我想打印防火墙-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 --state
,not 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