多行字符串上的 if 语句不起作用

多行字符串上的 if 语句不起作用

我正在尝试强制重启我的 rsyslog 服务器。我白天进行过卫生重启,有时重启失败,所以我想重启它直到重启成功。

此时,我正在尝试检查重启的输出是否与重启正常时应该给出的输出匹配。

但我不明白为什么if下面的语句不起作用。无论我在测试条件中放置==或,它总是转到 else 语句。!=

有没有办法检查多行字符串是否等于另一个预定义的多行字符串?

#!/bin/sh
endv=0
testv="Shutting down system logger: [  OK  ]
Starting system logger: [  OK  ]"
startv="$(/etc/init.d/rsyslog restart)"

while [ $endv == 0 ]; do
        echo "$startv"
            if [[ "$startv" != "$testv" ]]; then
               startv="$(/etc/init.d/rsyslog restart)"
                echo THEN
            else
                echo ELSE
                endv=1
            fi
done

答案1

一些准备工作:

  1. 您可能应该不再直接调用 SysV init 脚本;您至少落后一步,甚至可能落后两步( SysV init 被 取代upstart,然后被 取代systemd)。例如:

    systemctl restart rsyslog.service
    
  2. 无论您使用哪种 init 接口,您都可以直接使用命令,EXIT_STATUS而不必捕获其输出并测试字符串相等性。例如:

    systemctl restart rsyslog.service
    if [ $? -ne 0 ]; then
      ...
    fi
    

    (无论如何,正如@choroba 在评论中指出的那样,'[OK]' 消息实际上可能会发送到标准错误而不是标准输出)。

  3. 在 Ubuntu 中/bin/sh不是bash:参见破折号.除此之外,这意味着它将不支持[[ . . . ]]扩展测试语法。


解决了这些问题后,bash确实支持对多行字符串进行字符串相等性测试,例如

$ str1='This is
a string'
$ str2='That is
a string'
$ str3='This is
a string'
$
$ [[ "$str1" != "$str1" ]] && echo "No match" || echo "Match"
Match
$ [[ "$str1" != "$str2" ]] && echo "No match" || echo "Match"
No match
$ [[ "$str1" != "$str3" ]] && echo "No match" || echo "Match"
Match

相关内容