Verificando se um número decimal está em um intervalo em bc

1

Eu escrevi isso se, obviamente, não está funcionando, e ainda não consigo superar:

#LASTEFFECTIVEHASH
if (( $(echo "$LASTEFFECTIVEHASHMINVAL < $LASTEFFECTIVEHASH < $LASTEFFECTIVEHASHMAXVAL" | $BC -l) )); then
                echo "$DATESTAMP - LASTEFFECTIVEHASH=$LASTEFFECTIVEHASH is between $LASTEFFECTIVEHASHMINVAL and $LASTEFFECTIVEHASHMAXVAL"|tee -a $LOGFILE
else
                echo "$DATESTAMP - LASTEFFECTIVEHASH=$LASTEFFECTIVEHASH is not between $LASTEFFECTIVEHASHMINVAL and $LASTEFFECTIVEHASHMAXVAL"|tee -a $MSGFILE $LOGFILE
fi

Mas, quando os valores estão fora dos intervalos, isso resulta em:

20170810003646 - LASTEFFECTIVEHASH=139.2 is between 104.9 and 136.9

Estou seguindo a sintaxe matemática: se x > 104,9 e < 136.9, em matemática você escreve 104.9 < x < 136.9 . Mas suspeito que o bash / bc esteja se comportando de maneira diferente do professor de matemática.

Seria ótimo se bc não deixasse de contar até 137;)

    
por Marco 10.08.2017 / 00:48

1 resposta

3

Ao contrário, por exemplo, de python, bc não suporta comparações encadeadas:

a < b < c

Para realizar as duas comparações e exigir que ambas sejam verdadeiras, use lógico-e (requer GNU bc):

(a < b) && (b < c)

Por exemplo:

$ a=104.9; b=136; c=136.9; if echo "($a < $b) && ($b < $c)" | bc -l | grep -q 1; then echo True; else echo False; fi
True
$ a=104.9; b=137; c=136.9; if echo "($a < $b) && ($b < $c)" | bc -l | grep -q 1; then echo True; else echo False; fi
False

POSIX bc

Se você não tem o GNU bc, você pode substituir a lógica e com a multiplicação:

$ a=104.9; b=136; c=136.9; if echo "($a < $b)*($b < $c)" | bc -l | grep -q 1; then echo True; else echo False; fi
True
$ a=104.9; b=137; c=136.9; if echo "($a < $b)*($b < $c)" | bc -l | grep -q 1; then echo True; else echo False; fi
False
    
por 10.08.2017 / 01:12