Como comparar valores flutuantes em um script de shell?

4

Preciso alertar se minha média de carga é maior que 10.

Eu poderia fazer assim se meu comando awk retornasse um inteiro:

declare -i MAX_LOAD=10

declare -i L1='cat /proc/loadavg | awk {'print $1'}'

if [ $L1 -gt $MAX_LOAD ]
then
    echo "Alert"
fi

Mas retorna valor flutuante em L1 (por exemplo, 2,35).

Como posso comparar os valores neste cenário?

    
por Spike 22.10.2015 / 21:36

1 resposta

3

Como você já está usando o awk, talvez a maneira mais simples seja fazer o comparação de flutuação dentro desta linguagem também:

MAX_LOAD=10.0
if ! </proc/loadavg awk -vmax_load=$MAX_LOAD '{ exit $1 > max_load }'
then
    echo Alert
fi

Observe que há alguns truques acontecendo: o operador ! inverte o teste. Isso é necessário porque a expressão booleana awk e o código de status que a construção if recebe valores significados opostos. O < é usado para direcionar o arquivo /proc/loadavg na entrada padrão do awk. Chamando o awk com -vmax_load=$MAX_LOAD define a variável awk max_load para o valor da variável shell MAX_LOAD .

No seu caso particular, desde que seu MAX_LOAD é um inteiro, e desde tudo o que você está lendo o primeiro float de um arquivo, uma solução ad-hoc seria:

if [ $(</proc/loadavg cut -f1 -d.) -gt $MAX_LOAD ] ...

A chamada para cut extrairá a parte integral do primeiro número em código%. A ideia se quebra se qualquer uma das suposições indicado acima se tornar falso, no entanto.

    
por 22.10.2015 / 21:57