como testar a expressão inteira (extraída do comando) na instrução IF

0

Eu criei um script simples no bash para iniciar o serviço do sistema se o sistema estiver inativo por mais do que o valor limite. Se parte, basicamente verifique o valor inteiro (extraído do commnd) com limite valor (inteiro)

controle não vai se declaração. Alguém pode me sugerir a solução acima? como testar a expressão de inteiro na instrução IF.

#!/bin/bash
**function start_repair {                                                       
        threshold=120
        IP=10.194.51.216
        echo "$((systemctl status cassandra | awk'/(Active:failed)/{print$10}')| awk '{print ($0+0)}')"
        if [[ "$((systemctl status cassandra | awk '/(Active: failed)/{print $10}') | awk '{print ($0+0)}')" -gt "${threshold}" ]]; then
          echo "greater than ${threshold}"
          service cassandra restart
          PID=$!
          wait $PID
          echo done
    fi }**

ERRO: bash: linha 5: [:: expressão inteira esperada

    
por Parul Chourasia 24.04.2018 / 09:28

1 resposta

0

Existem alguns problemas com a sua pergunta e com a sua função.

Primeiro, o erro [: : integer expression expected não é gerado pela sua função . O teste [[ ... -gt ... ]] na função não gera esse erro (teste-o na linha de comando com [[ "hello" -gt "world" ]] ). Você tem outro teste em algum lugar, usando colchetes únicos, que gera esse erro (teste isso na linha de comando com [ "hello" -gt "world" ] ). Procure um teste de aritmética [ ... ] em outro lugar em seu código.

Você pode ver isso na própria mensagem de erro, pois bash diz a você que é o utilitário [ que produz um erro e que a coisa que tentou fazer um teste aritmético é uma cadeia vazia.

Você disse em comentários que a alteração de print (0+$0) para print 0+$0 em seu código awk fez com que funcionasse. Duvido que essa mudança tenha feito alguma diferença, pois as declarações são equivalentes. É mais provável que a entrada para o script tenha sido alterada de tal forma que o erro não foi acionado.

Em seguida, você comentou que alterou -gt para > no teste. Isso altera o teste para um teste de ordem de seqüência lexicográfica. Esse teste seria verdadeiro se a sequência do lado esquerdo fosse ordenada após a sequência do lado direito, portanto, por exemplo, 20 > 100 seria verdadeiro .

Isso também está perdendo o ponto de que o erro não está na função que você está apresentando.

Minha sugestão é escrever seu script e testar cada componente do script enquanto você o escreve, para que você saiba que cada adição ao script faz o que você quer que ele faça.

Quanto à função em si, ela tem vários problemas.

Por exemplo, a variável PID provavelmente deve conter o ID do processo cassandra , mas você não inicia cassandra como uma tarefa em segundo plano (usando & no final do processo). comando), PID não será o que você acha que deveria ser, e o wait $PID subseqüente não irá esperar pelo processo que você acha que está esperando.

Não está claro o que você deseja alcançar com a variável PID e a chamada wait . Meu palpite é que você pode simplesmente remover a atribuição para PID e a chamada para wait .

O $(( ... ) | ... ) é melhor escrito como $( ... | ... ) . Em primeiro lugar, executar systemctl | awk em um subshell é desnecessário e, em segundo lugar, é confuso ler porque $(( ... )) é uma avaliação aritmética .

O código

awk'/(Active:failed)/ {print $10}' | awk '{print ($0+0)}'

pode ser combinado em

awk'/(Active:failed)/ { print 0+$10 }'
    
por 24.04.2018 / 10:59