Я пытаюсь принудительно перезапустить мой сервер rsyslog. У меня есть санитарная перезагрузка в течение дня, и иногда перезапуск завершается с ошибкой, поэтому я хочу перезапустить его до тех пор, пока перезапуск не будет успешным.
На этом этапе я пытаюсь проверить, соответствует ли результат перезапуска вывод, который он должен дать, когда перезагрузка хороша.
Но я не понимаю, почему приведенный ниже оператор if не работает. Он всегда переходит к утверждению else, помещаю ли я == или != в тестовое условие.
Есть ли способ проверить, соответствует ли многострочная строка другой предопределенной многострочной string?
#!/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; вы по крайней мере один и, вероятно, два шага за кривой (SysV init был заменен на upstart, а затем на systemd). Например:systemctl restart rsyslog.service
Независимо от того, какой интерфейс вы используете, скорее всего, вы можете использовать команду EXIT_STATUS непосредственно, а не фиксировать его вывод и проверку равенства строк. Например: systemctl restart rsyslog.service
if [ $? -ne 0 ]; then
...
fi
(в любом случае, как @choroba, выраженное в комментариях, сообщение «[OK]» может фактически означать стандартную ошибку, а не стандартный вывод). В 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
Несколько предварительных комментариев:
Вы, вероятно, должны уйти от непосредственного вызова скриптов SysV; вы по крайней мере один и, вероятно, два шага за кривой (SysV init был заменен на upstart, а затем на systemd). Например:systemctl restart rsyslog.service
Независимо от того, какой интерфейс вы используете, скорее всего, вы можете использовать команду EXIT_STATUS непосредственно, а не фиксировать его вывод и проверку равенства строк. Например: systemctl restart rsyslog.service
if [ $? -ne 0 ]; then
...
fi
(в любом случае, как @choroba, выраженное в комментариях, сообщение «[OK]» может фактически означать стандартную ошибку, а не стандартный вывод). В 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
Несколько предварительных комментариев:
Вы, вероятно, должны уйти от непосредственного вызова скриптов SysV; вы по крайней мере один и, вероятно, два шага за кривой (SysV init был заменен на upstart, а затем на systemd). Например:systemctl restart rsyslog.service
Независимо от того, какой интерфейс вы используете, скорее всего, вы можете использовать команду EXIT_STATUS непосредственно, а не фиксировать его вывод и проверку равенства строк. Например: systemctl restart rsyslog.service
if [ $? -ne 0 ]; then
...
fi
(в любом случае, как @choroba, выраженное в комментариях, сообщение «[OK]» может фактически означать стандартную ошибку, а не стандартный вывод). В 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