если оператор на многострочной строке, не работающей

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

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 полагал в комментариях,' [хорошо]' сообщение может на самом деле идти в стандартную погрешность, а не стандартный вывод).

  3. В 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
ответ дан 3 November 2019 в 11:46

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

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