Comparar (IF) variável com casa decimal [RESOLVIDO]

1. Comparar (IF) variável com casa decimal [RESOLVIDO]

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 27/01/2017 - 06:11h

Prezados, aqui estou em busca de mais uma ajuda neste ótimo fórum. Eu possuo um script que lê o valor de um instrumento que indica a umidade relativa do ar e joga este valor numa variável, para depois enviar esta variável para um sistema de automação. Este script está funcionando corretamente, pois o valor da umidade relativa do ar é apresentado no sistema. O que acontece é que eu preciso tratar esta variável dentro do mesmo script, para que ela gere outra antes de ser enviada ao sistema de automação. E aí é que está meu problema, pois esta variável possui uma casa decimal, o que dificulta o seu tratamento dentro do script. Resumindo, o que eu precisaria era multiplicar esta variável por 10 dentro do script, fazer o tratamento para gerar outra variável e voltar a dividí-la por 10 para ter novamente o valor original. Segue um exemplo:

HUMIDITY=59.6  #Supondo que o valor lido no instrumento é 59.6

# Gerar $HUM_STAT com a condição da umidade do ar:
# 0 = Normal
# 1 = Comfortable
# 2 = Sec
# 3 = Moist

# Aqui eu precisaria multliplicar $HUMIDITY por 10, para que vire 596.

if [ $HUMIDITY -lt 300 ]; then
HUM_STAT=2
elif [ $HUMIDITY -ge 300 && $HUMIDITY -lt 450 ]; then
HUM_STAT=0
elif [ $HUMIDITY -ge 450 && $HUMIDITY -ge 700 ]; then
HUM_STAT=1
elif [ $HUMIDITY -gt 700 ]; then
HUM_STAT=3
else
HUM_STAT=0
fi

# Aqui eu precisaria dividir $HUMIDITY por 10, para que vire 59.6 novamente e o script continue.

Eu tentei alguns exemplos que achei no Google que utilizam o comando "bc", porém sem sucesso. Minha variável HUM_STAT caía sempre no "else" e ficava com o valor "0". Agradeço quem puder me dar uma luz!


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 29/01/2017 - 14:43h

moacir_79 escreveu:

Caro msoliver, fiz uns testes aqui e pelo que percebi o awk está funcionando corretamente, só não está conseguindo setar a variável HUM_STAT. Eu utilizei o seguinte comando:

awk '{if($1<30) print "X";else if($1>=30 && $1<45) print "XX";else if($1>=45 && $1<=70) print "XXX";else if($1>70) print "XXXX"}' <<< $HUMIDITY 

A quantidade de X apresentada na tela varia conforme as faixas de umidade corretamente. Porém quando mudo para:

awk '{if($1<30) HUM_STAT=2;else if($1>=30 && $1<45) HUM_STAT=0;else if($1>=45 && $1<=70) HUM_STAT=1;else if($1>70) HUM_STAT=3}' <<< $HUMIDITY 

A variável HUM_STAT não é setada. O que poderia esta acontecendo?


Moacir. boa tarde.
Faça o seguinte:

HUM_STAT=$(awk '{if ($1 -lt 30) print "2";
else if ($1 -ge 30 && $1 -lt 45) print "0";
else if ($1 -ge 45 && $1 -ge 70) print "1";
else if ($1 -gt 70) print "3"; <<< "$HUM_STAT")


OBS.:
TROQUE "-lt" por "<"
"-ge" por ">="
"-gt" por ">"

marcelo oliver



3. Re: Converter e reverter variável com casa decimal

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/01/2017 - 08:27h

Bom dia!

essa linha funcionou aqui, converteu 59.6 em 596.0

HUMIDITY=`echo "scale=2;($HUMIDITY*10)" | bc`

porém eu acho que seu problema eh que o bash nao consegue comparar nao inteiros (que coisa hein?) http://unix.stackexchange.com/questions/24721/how-to-compare-to-floating-point-number-in-a-shell-scr...


4. Re: Converter e reverter variável com casa decimal

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 27/01/2017 - 09:43h

moacir_79 escreveu:

Prezados, aqui estou em busca de mais uma ajuda neste ótimo fórum. Eu possuo um script que lê o valor de um instrumento que indica a umidade relativa do ar e joga este valor numa variável, para depois enviar esta variável para um sistema de automação. Este script está funcionando corretamente, pois o valor da umidade relativa do ar é apresentado no sistema. O que acontece é que eu preciso tratar esta variável dentro do mesmo script, para que ela gere outra antes de ser enviada ao sistema de automação. E aí é que está meu problema, pois esta variável possui uma casa decimal, o que dificulta o seu tratamento dentro do script. Resumindo, o que eu precisaria era multiplicar esta variável por 10 dentro do script, fazer o tratamento para gerar outra variável e voltar a dividí-la por 10 para ter novamente o valor original. Segue um exemplo:

HUMIDITY=59.6  #Supondo que o valor lido no instrumento é 59.6

# Gerar $HUM_STAT com a condição da umidade do ar:
# 0 = Normal
# 1 = Comfortable
# 2 = Sec
# 3 = Moist

# Aqui eu precisaria multliplicar $HUMIDITY por 10, para que vire 596.

if [ $HUMIDITY -lt 300 ]; then
HUM_STAT=2
elif [ $HUMIDITY -ge 300 && $HUMIDITY -lt 450 ]; then
HUM_STAT=0
elif [ $HUMIDITY -ge 450 && $HUMIDITY -ge 700 ]; then
HUM_STAT=1
elif [ $HUMIDITY -gt 700 ]; then
HUM_STAT=3
else
HUM_STAT=0
fi

# Aqui eu precisaria dividir $HUMIDITY por 10, para que vire 59.6 novamente e o script continue.

Eu tentei alguns exemplos que achei no Google que utilizam o comando "bc", porém sem sucesso. Minha variável HUM_STAT caía sempre no "else" e ficava com o valor "0". Agradeço quem puder me dar uma luz!


Bom dia.
Para tratar nºs decimais, uma alternativa é o "awk".
Exemplo:
awk '{if($1<=10) print $1", MENOR QUE 10";else if($1<=20) print $1", É MENOR QUE 20"}' <<< "19.40"
19.40, É MENOR QUE 20


Veja mais exemplos em:
http://www.thegeekstuff.com/2010/02/awk-conditional-statements 


att.:
marcelo oliver




5. Re: Converter e reverter variável com casa decimal

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 27/01/2017 - 11:21h

Caro felipe_, realmente com o "bc" o retorno é sempre HUM_STAT=0. Já com a dica do msoliver, eu consegui travar a execução do meu script. Eu fiz o seguinte:
awk '{if ($HUMIDITY -lt 30) HUM_STAT=2;
else if ($HUMIDITY -ge 30 && $HUMIDITY -lt 45) HUM_STAT=0;
else if ($HUMIDITY -ge 45 && $HUMIDITY -ge 70) HUM_STAT=1;
else if ($HUMIDITY -gt 70) HUM_STAT=3;
else HUM_STAT=0}'

Há algum erro em minha sintaxe para fazer o script travar?


6. Re: Comparar (IF) variável com casa decimal [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 27/01/2017 - 15:15h

moacir_79 escreveu:

Caro felipe_, realmente com o "bc" o retorno é sempre HUM_STAT=0. Já com a dica do msoliver, eu consegui travar a execução do meu script. Eu fiz o seguinte:
awk '{if ($HUMIDITY -lt 30) HUM_STAT=2;
else if ($HUMIDITY -ge 30 && $HUMIDITY -lt 45) HUM_STAT=0;
else if ($HUMIDITY -ge 45 && $HUMIDITY -ge 70) HUM_STAT=1;
else if ($HUMIDITY -gt 70) HUM_STAT=3;
else HUM_STAT=0}'

Há algum erro em minha sintaxe para fazer o script travar?


Boa tarde Moacir.
Da forma que voce colocou, a VAR HUMIDITY, não é resolvida devido as aspas simples da sintaxe do awk.
Uma opção e colocar $HUMIDITY como argumento, exemplo:
awk '{if ($1 -lt 30) HUM_STAT=2;
else if ($1 -ge 30 && $1 -lt 45) HUM_STAT=0;
else if ($1 -ge 45 && $1 -ge 70) HUM_STAT=1;
else if ($1 -gt 70) HUM_STAT=3;
else HUM_STAT=0}' <<< $HUMIDITY



Marcelo oliver


7. Re: Converter e reverter variável com casa decimal

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 28/01/2017 - 17:03h

Caro msoliver, fiz uns testes aqui e pelo que percebi o awk está funcionando corretamente, só não está conseguindo setar a variável HUM_STAT. Eu utilizei o seguinte comando:

awk '{if($1<30) print "X";else if($1>=30 && $1<45) print "XX";else if($1>=45 && $1<=70) print "XXX";else if($1>70) print "XXXX"}' <<< $HUMIDITY 

A quantidade de X apresentada na tela varia conforme as faixas de umidade corretamente. Porém quando mudo para:

awk '{if($1<30) HUM_STAT=2;else if($1>=30 && $1<45) HUM_STAT=0;else if($1>=45 && $1<=70) HUM_STAT=1;else if($1>70) HUM_STAT=3}' <<< $HUMIDITY 

A variável HUM_STAT não é setada. O que poderia esta acontecendo?


8. Re: Comparar (IF) variável com casa decimal [RESOLVIDO]

Moacir Barriles
moacir_79

(usa Debian)

Enviado em 29/01/2017 - 21:09h

msoliver escreveu:

moacir_79 escreveu:

Caro msoliver, fiz uns testes aqui e pelo que percebi o awk está funcionando corretamente, só não está conseguindo setar a variável HUM_STAT. Eu utilizei o seguinte comando:

awk '{if($1<30) print "X";else if($1>=30 && $1<45) print "XX";else if($1>=45 && $1<=70) print "XXX";else if($1>70) print "XXXX"}' <<< $HUMIDITY 

A quantidade de X apresentada na tela varia conforme as faixas de umidade corretamente. Porém quando mudo para:

awk '{if($1<30) HUM_STAT=2;else if($1>=30 && $1<45) HUM_STAT=0;else if($1>=45 && $1<=70) HUM_STAT=1;else if($1>70) HUM_STAT=3}' <<< $HUMIDITY 

A variável HUM_STAT não é setada. O que poderia esta acontecendo?


Moacir. boa tarde.
Faça o seguinte:

HUM_STAT=$(awk '{if ($1 -lt 30) print "2";
else if ($1 -ge 30 && $1 -lt 45) print "0";
else if ($1 -ge 45 && $1 -ge 70) print "1";
else if ($1 -gt 70) print "3"; <<< "$HUM_STAT")


OBS.:
TROQUE "-lt" por "<"
"-ge" por ">="
"-gt" por ">"

marcelo oliver


Simplesmente NA MOSCA msoliver!!! Agora a variável HUM_STAT é setada corretamente e o sistema funciona perfeitamente! O comando que usei ficou assim:

HUM_STAT=$(awk '{if($1<30) print "2";else if($1>=30 && $1<45) print "0";else if($1>=45 && $1<=70) print "1";else if($1>70) print "3"}' <<< $HUMIDITY) 

Antes de marcar o tópico como resolvido, o que acha de mudar o título para:
Comparar (IF) variável com casa decimal

Acredito que desta forma fique mais específico com a situação e facilite a busca de outros que tenham a mesma dúvida. E MUITO obrigado por suas dicas! Sem elas eu não teria conseguido.


9. Re: Comparar (IF) variável com casa decimal [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 29/01/2017 - 22:08h

moacir_79 escreveu:

msoliver escreveu:

moacir_79 escreveu:

Caro msoliver, fiz uns testes aqui e pelo que percebi o awk está funcionando corretamente, só não está conseguindo setar a variável HUM_STAT. Eu utilizei o seguinte comando:

awk '{if($1<30) print "X";else if($1>=30 && $1<45) print "XX";else if($1>=45 && $1<=70) print "XXX";else if($1>70) print "XXXX"}' <<< $HUMIDITY 

A quantidade de X apresentada na tela varia conforme as faixas de umidade corretamente. Porém quando mudo para:

awk '{if($1<30) HUM_STAT=2;else if($1>=30 && $1<45) HUM_STAT=0;else if($1>=45 && $1<=70) HUM_STAT=1;else if($1>70) HUM_STAT=3}' <<< $HUMIDITY 

A variável HUM_STAT não é setada. O que poderia esta acontecendo?


Moacir. boa tarde.
Faça o seguinte:

HUM_STAT=$(awk '{if ($1 -lt 30) print "2";
else if ($1 -ge 30 && $1 -lt 45) print "0";
else if ($1 -ge 45 && $1 -ge 70) print "1";
else if ($1 -gt 70) print "3"; <<< "$HUM_STAT")


OBS.:
TROQUE "-lt" por "<"
"-ge" por ">="
"-gt" por ">"

marcelo oliver


Simplesmente NA MOSCA msoliver!!! Agora a variável HUM_STAT é setada corretamente e o sistema funciona perfeitamente! O comando que usei ficou assim:

HUM_STAT=$(awk '{if($1<30) print "2";else if($1>=30 && $1<45) print "0";else if($1>=45 && $1<=70) print "1";else if($1>70) print "3"}' <<< $HUMIDITY) 

Antes de marcar o tópico como resolvido, o que acha de mudar o título para:
Comparar (IF) variável com casa decimal

Acredito que desta forma fique mais específico com a situação e facilite a busca de outros que tenham a mesma dúvida. E MUITO obrigado por suas dicas! Sem elas eu não teria conseguido.


Moacir, concordo com a mudança do título....

Por nada Moacir! . . .
Se não for pedir muito . . . Depois de marcar como resolvido, marque a minha resposta como "A MELHOR",
dessa forma sou pontuado no fórum . . .

Abraço,
Marcelo Oliver











Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts