我正在尝试强制重启我的 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
一些准备工作:
您可能应该不再直接调用 SysV init 脚本;您至少落后一步,甚至可能落后两步( SysV init 被 取代
upstart
,然后被 取代systemd
)。例如:systemctl restart rsyslog.service
无论您使用哪种 init 接口,您都可以直接使用命令,
EXIT_STATUS
而不必捕获其输出并测试字符串相等性。例如:systemctl restart rsyslog.service if [ $? -ne 0 ]; then ... fi
(无论如何,正如@choroba 在评论中指出的那样,'[OK]' 消息实际上可能会发送到标准错误而不是标准输出)。
在 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