Я пытаюсь вызвать перезапуск своего rsyslog сервера. У меня есть санитарная перезагрузка в течение дня и иногда сбои перезапуска, таким образом, я хочу перезапустить ее, пока перезапуск не имеет успех.
В этой точке я пытаюсь проверить, соответствует ли вывод перезапуска выводу, это, как предполагается, дает, когда перезапуск хорош.
Но я не понимаю почему if
оператор ниже не работает. Это всегда еще переходит в оператор, поместил ли я a ==
или !=
в условии испытания.
Существует ли способ проверить, равна ли многострочная строка другой предопределенной многострочной строке?
#!/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
Несколько предварительных выборов:
необходимо, вероятно, переезжать от вызова сценариев SysV init непосредственно; Вы - по крайней мере один, и вероятно два шага позади кривой (SysV init был заменен upstart
и затем systemd
). Например:
systemctl restart rsyslog.service
, Какой бы ни init соединяют интерфейсом с Вами использование, вероятно, что можно использовать команду EXIT_STATUS
непосредственно вместо того, чтобы получить ее вывод и протестировать строковое равенство. Например:
systemctl restart rsyslog.service
if [ $? -ne 0 ]; then
...
fi
(в любом случае, поскольку @choroba полагал в комментариях,' [хорошо]' сообщение может на самом деле идти в стандартную погрешность, а не стандартный вывод).
В Ubuntu, /bin/sh
не bash
: см. DashAsBinSh. Среди прочего это означает, что не будет поддерживать [[ . . . ]]
расширенный тестовый синтаксис.
Имел тех, которые из пути, 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