если инструкция для многострочной строки не работает

Я пытаюсь принудительно перезапустить мой сервер 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
0
задан 11 April 2017 в 17:17

3 ответа

Несколько предварительных комментариев:

Вы, вероятно, должны уйти от непосредственного вызова скриптов 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
0
ответ дан 18 July 2018 в 15:11

Несколько предварительных комментариев:

Вы, вероятно, должны уйти от непосредственного вызова скриптов 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
0
ответ дан 24 July 2018 в 20:34

Несколько предварительных комментариев:

Вы, вероятно, должны уйти от непосредственного вызова скриптов 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
0
ответ дан 31 July 2018 в 23:36

Другие вопросы по тегам:

Похожие вопросы: