Testar condições com variável float [RESOLVIDO]

1. Testar condições com variável float [RESOLVIDO]

William Amaral de Souza
Williamm

(usa Linux Mint)

Enviado em 22/02/2019 - 09:58h

Bom dia, estou recebendo valores de temperaturas exemplo 10.51, 10.41, 5.10... Como eu posso fazer para testar?
Exemplo:

#!/bin/bash
TEMP=25.18
LIMITE=25

if [ "$TEMP" -gt "$LIMITE" ]; then
echo "Maior"
fi



Ele retorna um erro: linha 5: [: 25.18: esperava expressão de número inteiro



Ja testei com esse exemplo:

#!/bin/bash
TEMP=25.18
LIMITE=25

if [ ${TEMP%.*} -gt $LIMITE ]; then
echo "Maior"
fi

Mas ele so informa ser maior se a temperatura for nesse caso 26 e não a partir de 25.1



  


2. Re: Testar condições com variável float [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/02/2019 - 12:38h

O bash não trabalha com números fracionários, mas apenas com inteiros.

Se você precisa de números com ponto flutuante, algumas alternativas são usar um shell diferente, como o ksh (provavelmente ksh93, acho que o ksh88 não suporta ponto flutuante também; possivelmente algumas versões gratuitas de ksh, como o pdksh e mksh sejam compatíveis com o ksh88, não com o ksh93, mas seria melhor você testar) ou usar uma linguagem de script em lugar do shell, como awk, Perl ou Python.

Você também pode invocar trechos de linguagens de scripts (ou outras ferramentas, como bc ou dc) a partir do shell só para fazer a computação de que você precisar e retornar um valor que o shell possa usar, mas isso pode ser mais dispendioso do que converter todo o script para outra linguagem, porque cada operação matemática implicaria criar um processo novo, invocar o executável que vai computar a operação, e interpretar o resultado da execução.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


3. Re: Testar condições com variável float [RESOLVIDO]

William Amaral de Souza
Williamm

(usa Linux Mint)

Enviado em 22/02/2019 - 15:05h

paulo1205 escreveu:

O bash não trabalha com números fracionários, mas apenas com inteiros.

Se você precisa de números com ponto flutuante, algumas alternativas são usar um shell diferente, como o ksh (provavelmente ksh93, acho que o ksh88 não suporta ponto flutuante também; possivelmente algumas versões gratuitas de ksh, como o pdksh e mksh sejam compatíveis com o ksh88, não com o ksh93, mas seria melhor você testar) ou usar uma linguagem de script em lugar do shell, como awk, Perl ou Python.

Você também pode invocar trechos de linguagens de scripts (ou outras ferramentas, como bc ou dc) a partir do shell só para fazer a computação de que você precisar e retornar um valor que o shell possa usar, mas isso pode ser mais dispendioso do que converter todo o script para outra linguagem, porque cada operação matemática implicaria criar um processo novo, invocar o executável que vai computar a operação, e interpretar o resultado da execução.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)



Consegui, procurei por esse "bc" e consegui utilizar, obrigado!!!

Ficou dessa forma dai...

#!/bin/bash
TEMP=10.1
LIMITE=25
MIN=-10

if [ $(echo "scale=2; $TEMP > $LIMITE" | bc) -eq 1 ] || [ $(echo "scale=2; $TEMP < $MIN" | bc) -eq 1 ]; then
echo "Alerta"
fi




4. Re: Testar condições com variável float [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/02/2019 - 18:39h

Williamm escreveu:

Consegui, procurei por esse "bc" e consegui utilizar, obrigado!!!

Ficou dessa forma dai...

#!/bin/bash
TEMP=10.1
LIMITE=25
MIN=-10

if [ $(echo "scale=2; $TEMP > $LIMITE" | bc) -eq 1 ] || [ $(echo "scale=2; $TEMP < $MIN" | bc) -eq 1 ]; then
echo "Alerta!"
fi


Como eu disse antes, eu não sou muito fã de invocar programas externos quando é possível evitar. Mas isso é mais fácil dizer quando já se tem o hábito de programar em outras linguagens (no meu caso, eu uso muito Perl para scripts, em vez de shell).

No entanto, já que você está invocando um comando externo, pelo menos evite chamar o mesmo comando duas vezes. Você pode conseguir o mesmo efeito do if que você fez deixando que o próprio bc faça o teste de ou-lógico.
if (( $(bc -l <<<"$TEMP > $LIMITE || $TEMP < $MIN" ) )); then
echo "Alerta!"
fi
ou
(( $(bc -l <<<"$TEMP > $LIMITE || $TEMP < $MIN" ) )) && echo "Alerta!" 




... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


5. Re: Testar condições com variável float [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 22/02/2019 - 20:18h


Williamm escreveu:

Bom dia, estou recebendo valores de temperaturas exemplo 10.51, 10.41, 5.10... Como eu posso fazer para testar?
Exemplo:

#!/bin/bash
TEMP=25.18
LIMITE=25

if [ "$TEMP" -gt "$LIMITE" ]; then
echo "Maior"
fi


Ele retorna um erro: linha 5: [: 25.18: esperava expressão de número inteiro
Ja testei com esse exemplo:

#!/bin/bash
TEMP=25.18
LIMITE=25

if [ ${TEMP%.*} -gt $LIMITE ]; then
echo "Maior"
fi

Mas ele so informa ser maior se a temperatura for nesse caso 26 e não a partir de 25.1


Boa noite.
Segue sugestão:
awk '{if($1>$2) print "ALERTA";else print "OK"}' <<< "$TEMP $LIMITE" 

att.:
marcelo oliver




6. Re: Testar condições com variável float [RESOLVIDO]

William Amaral de Souza
Williamm

(usa Linux Mint)

Enviado em 22/02/2019 - 23:01h

paulo1205 escreveu:

Williamm escreveu:

Consegui, procurei por esse "bc" e consegui utilizar, obrigado!!!

Ficou dessa forma dai...

#!/bin/bash
TEMP=10.1
LIMITE=25
MIN=-10

if [ $(echo "scale=2; $TEMP > $LIMITE" | bc) -eq 1 ] || [ $(echo "scale=2; $TEMP < $MIN" | bc) -eq 1 ]; then
echo "Alerta!"
fi


Como eu disse antes, eu não sou muito fã de invocar programas externos quando é possível evitar. Mas isso é mais fácil dizer quando já se tem o hábito de programar em outras linguagens (no meu caso, eu uso muito Perl para scripts, em vez de shell).

No entanto, já que você está invocando um comando externo, pelo menos evite chamar o mesmo comando duas vezes. Você pode consegui o mesmo efeito do if que você fez deixando que o próprio bc faça o teste de ou-lógico.
if (( $(bc -l <<<"$TEMP > $LIMITE || $TEMP < $MIN" ) )); then
echo "Alerta!"
fi
ou
(( $(bc -l <<<"$TEMP > $LIMITE || $TEMP < $MIN" ) )) && echo "Alerta!" 




... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)



Show de bola, muito obrigado, esse ficou bem melhor...

if (( $(bc -l <<<"$TEMP > $LIMITE || $TEMP < $MIN" ) )); then
echo "Alerta!"
fi
ou







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts