se a instrução na cadeia de múltiplas linhas não estiver funcionando

0

Estou tentando forçar a reinicialização do meu servidor rsyslog. Eu tenho reinicialização sanitária durante o dia e, às vezes, a reinicialização falha, por isso quero reiniciá-la até que a reinicialização seja um sucesso.

Neste ponto, estou tentando verificar se a saída da reinicialização corresponde à saída que ela deve fornecer quando a reinicialização for boa.

Mas não entendo por que a declaração if abaixo não funciona. Ele sempre vai para a instrução else, se eu colocar um == ou != na condição de teste.

Existe uma maneira de verificar se uma string de várias linhas é igual a outra string de várias linhas predefinida?

#!/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
    
por N.Lacroix 11.04.2017 / 15:44

1 resposta

0

Algumas preliminares:

  1. Você provavelmente deve estar se afastando de invocar scripts init do SysV diretamente; você tem pelo menos um e provavelmente dois passos atrás da curva (o init do SysV foi substituído por upstart e depois por systemd ). Por exemplo:

    systemctl restart rsyslog.service
    
  2. Seja qual for a interface do init usada, é provável que você possa usar o comando EXIT_STATUS diretamente, em vez de capturar sua saída e testar a igualdade da cadeia de caracteres. Por exemplo:

    systemctl restart rsyslog.service
    if [ $? -ne 0 ]; then
      ...
    fi
    

    (em qualquer caso, como @choroba destacou nos comentários, a mensagem '[OK]' pode, na verdade, estar indo para um erro padrão em vez de uma saída padrão).

  3. No Ubuntu, /bin/sh não é bash : consulte DashAsBinSh . Entre outras coisas, isso significa que ele não suportará a sintaxe do teste estendido [[ . . . ]] .

Tendo conseguido isso, bash de fato suporta testes de igualdade de strings em strings de múltiplas linhas, por exemplo

$ 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
    
por steeldriver 11.04.2017 / 18:14