Não calcula casa decimais

1. Não calcula casa decimais

Morpheus
Minions

(usa Nenhuma)

Enviado em 13/10/2022 - 14:47h

P=2000
U=320

I=$(echo "scale=2; $P/$U" | bc )


O valor de I é: 6,25


if [ "$I" -le "15.5" ]; then

echo ""

elif [ "$I" -le "21" ]; then

echo ""
fi




  


2. Re: Não calcula casa decimais

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 13/10/2022 - 16:09h

Minions escreveu:

P=2000
U=320

I=$(echo "scale=2; $P/$U" | bc )


O valor de I é: 6,25

if [ "$I" -le "15.5" ]; then
echo ""
elif [ "$I" -le "21" ]; then
echo ""
fi

Minions boa tarde.
Bash não 'trabalha' com nºs decimais....
Opções para o condicional:
awk/gawk ou o bc
BC
(($(bc <<< "6.25 < 5.50"))) && echo TRUE || echo FALSE 

GAWK
gawk '{if($1>$2) print "true" ,$0;else print "false" ,$0}' <<< "5.25 5.75"
false 5.25 5.75
gawk '{if($1>$2) print "true" ,$0;else print "false" ,$0}' <<< "6.25 5.75"
true 6.25 5.75



______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



3. Re: Não calcula casa decimais

Xerxes
xerxeslins

(usa BigLinux)

Enviado em 13/10/2022 - 16:10h

Aparentemente o código está calculando a corrente elétrica a partir da potência (P) e da tensão (U). Se a corrente (I) for menor ou igual a 15.5, o código não faz nada. Se a corrente (I) for menor ou igual a 21, o código também não faz nada. Ou seja, não faz nada?


--
Chega uma hora na vida que você só quer bater o prego e não perder tempo estudando a ciência da construção de um martelo.



4. Re: Não calcula casa decimais

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/10/2022 - 19:24h

Se você quer um shell com suporte a aritmética de ponto flutuante, use o ksh93 ou zsh.

Alternativamente, use outra linguagem. Acima se sugeriu awk. Outras opções (melhores, na minha opinião) são Perl ou Python.


... Então Jesus afirmou de novo: “(…) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


5. Re: Não calcula casa decimais

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/10/2022 - 20:12h

Admito que numa usei nem instalei zsh, mas confiei em informações que vi na Internet, incluindo suas manpages.

Será que você não está fazendo alguma coisa errada? Qual locale você está usando?


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


6. Re: Não calcula casa decimais

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/10/2022 - 20:18h

Instalei o zsh só para testar.
$ zsh -c 'echo $(( 5.0 / 2 ))'
2.5

$ ksh93 -c 'echo $(( 5.0 / 2 ))'
2.5

$ dash -c 'echo $(( 5.0 / 2 ))'
dash: 1: arithmetic expression: expecting EOF: " 5.0 / 2 "

$ bash -c 'echo $(( 5.0 / 2 ))'
bash: line 1: 5.0 / 2 : syntax error: invalid arithmetic operator (error token is ".0 / 2 ")
$ export LC_ALL=pt_BR.UTF-8

$ zsh -c 'echo $(( 5.0 / 2 ))'
2.5

$ ksh93 -c 'echo $(( 5.0 / 2 ))'
ksh93: 5.0 / 2 : radix point '.' requires LC_NUMERIC=C

$ zsh -c 'echo $(( 5,0 / 2 ))'
0

$ ksh93 -c 'echo $(( 5,0 / 2 ))'
2,5


Eu seja: zsh e ksh93 suportam PF, sendo que o suporte do zsh não aplica locales na forma dos seus números de PF, mas o ksh93 o faz.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


7. Re: Não calcula casa decimais

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/10/2022 - 20:28h

Ah, agora que eu percebi que você não alterou o script original, e está usando o comando [ para testar usas expressões.

Experimente trocar para [[ ou usar a forma ((expressão)).
$ zsh -c '[[ 5.0 -lt 6.0 ]] && echo ok'
ok

$ zsh -c '(( 5.0 < 6.0 )) && echo ok'
ok

$ zsh -c '[ 5.0 -lt 6.0 ] && echo ok'
zsh:[:1: integer expression expected: 5.0



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


8. Re: Não calcula casa decimais

Morpheus
Minions

(usa Nenhuma)

Enviado em 13/10/2022 - 20:33h

Temos um numero decimal com numero inteiro.

I=15.748031496062


awk '{ print if [ "$I" -le "15" ]; then

echo 1

elif [ "$I" -le "21" ]; then

echo 2

elif [ "$I" -le "28" ]; then

echo 3

elif [ "$I" -le "36" ]; then

echo 4

elif [ "$I" -le "50" ]; then

echo 5

elif [ "$I" -le "68" ]; then

echo 6

elif [ "$I" -le "89" ]; then

echo 7

elif [ "$I" -le "111" ]; then

echo 8

elif [ "$I" -le "171" ]; then

echo 9

elif [ "$I" -le "237" ]; then

echo 10

else
echo " Opção Inválida! "
fi
}



[: 15.75: esperava expressão de número inteiro
encontrado EOF inesperado enquanto procurava por `'' correspondente
erro de sintaxe: fim prematuro do arquivo



9. Re: Não calcula casa decimais

Morpheus
Minions

(usa Nenhuma)

Enviado em 13/10/2022 - 20:47h


msoliver escreveu:

Minions escreveu:

P=2000
U=320

I=$(echo "scale=2; $P/$U" | bc )


O valor de I é: 6,25

if [ "$I" -le "15.5" ]; then
echo ""
elif [ "$I" -le "21" ]; then
echo ""
fi

Minions boa tarde.
Bash não 'trabalha' com nºs decimais....
Opções para o condicional:
awk/gawk ou o bc
BC
(($(bc <<< "6.25 < 5.50"))) && echo TRUE || echo FALSE 

GAWK
gawk '{if($1>$2) print "true" ,$0;else print "false" ,$0}' <<< "5.25 5.75"
false 5.25 5.75
gawk '{if($1>$2) print "true" ,$0;else print "false" ,$0}' <<< "6.25 5.75"
true 6.25 5.75



______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________




Deu ruim agora..... é japonês isso ai?????? :(



10. Re: Não calcula casa decimais

Morpheus
Minions

(usa Nenhuma)

Enviado em 13/10/2022 - 21:05h



O if fi só funciona com numero inteiro?



11. Re: Não calcula casa decimais

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 13/10/2022 - 21:19h

Minions escreveu:
Deu ruim agora..... é japonês isso ai?????? :(

------------------------------------------------------------------------------
Isso mesmo,
Escrito em:
katakana e hiragana.

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



12. Re: Não calcula casa decimais

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/10/2022 - 02:29h

Minions escreveu:

O if fi só funciona com numero inteiro?


Não. O comando if apenas verifica se o código de retorno de um outro comando é verdadeiro ou falso, e desvia o fluxo de execução de acordo com esse resultado.

Considere a seguinte construção.
if getent passwd paulo > /dev/null; then
echo 'Existe um usuário chamado "paulo".'
else
echo 'Não foi encontrado nenhum usuário chamado "paulo".' >&2
fi

Tal trecho faz exatamente o seguinte:

    1. Chama o comando externo getent para verificar se existe um usuário cujo login seja "paulo", redirecionando a saída para /dev/null, para que nada seja impresso na tela como parte da consulta. Se o usuário for encontrado, o comando vai retornar o código de retorno 0 (que o shell interpreta como verdadeiro); caso contrário, o código retornado será 2 (qualquer valor diferente de zero é considerado como falso).

    2. O comando if automaticamente intercepta o código de saída do comando recém-executado e desvia o fluxo de execução de acordo: se esse código for verdadeiro, vai executar o bloco iniciado por then e terminado pela próxima ocorrência de elif, else ou fi; caso contrário, ele vai pular sobre tal bloco, e desviando justamente para o ponto onde for encontrado o elif, else ou fi que o termina.

Quando você tem uma construção tal como “if [ $a -lt $b ]”, vai acontecer a mesma coisa: o shell vai executar o comando [, e é esse comando que efetivamente vai realizar o teste condicional, devolvendo ao if apenas um código de saída que vai ser interpretado como verdadeiro ou falso.

Originalmente, o comando [ era apenas o comando externo, figurando como um executável com nome /bin/[, que normalmente tinha como nome alternativo /bin/test (i.e. era um outro hard link para o mesmo inode), sendo que a única diferença entre esses dois era que o comando, quando invocado com o nome test, não exigia o terminador sintático “]”, ao passo que esse terminador era exigido quando o comando era invocado com o nome [. Entretanto, como era muito ineficiente chamar um comando externo a cada vez que se precisava realizar um teste condicional, alguns shells (provavelmente iniciando com o ksh de 1988) passaram a implementar uma versão interna desse comando, chamando-a de [[, em vez de simplesmente [, que trazia ganhos de desempenho não apenas por não exigir a invocação de um comando externo, mas também por não executar num processo separado, mas sim no mesmo processo em que foi invocado. Além disso, com um comando de teste de expressões interno, o shell podia acrescentar novos operadores, tal como -o, que permite verificar se o shell uma determinada opção de execução do shell está ativa ou não, algo que não é possível de se fazer quando se invoca um comando externo.

Além do [[, o ksh também introduziu uma forma totalmente interna de avaliar operações aritméticas, algo que o shell original também não tinha. Se uma variável n tinha um valor numérico, e a pessoa queria acrescentar 1 ao valor corrente dessa variável, o sh original exigia que se fizesse algo parecido com “v=`expr $v + 1`”, invocando o comando externo expr e interceptando a saída que esse comando imprimia e substituindo com ela o valor da variável. Com o ksh, surgiram as construções ((expressão)), que serve para avaliar uma expressão aritmética ou lógica, inclusive aquelas envolvendo variáveis, e $((expressão)), que faz o mesmo processamento de expressão aritmética e substitui o valor do resultado como parte da linha de comando.
var=1
echo $((var+1)) # imprime “2”
((var=10*var+1)) # agora var vai valer 11.
echo $(((var*=2)+2)) # agora var vai valer 22, e o comando echo vai imprimir “24”


Com o tempo, outros shells adotaram alguns dos comandos internos [[ expressão ]] e ((expressão)) e substituições aritmética $((expressão)) e de interceptação de saída $(comando) (que é semelhante em efeito à antiga forma `comando`, mas que, ao contrário desta última, permite aninhamentos). Diferentes shells adotaram diferentes conjuntos ou subconjuntos desses recursos.

O ksh93 introduziu aritmética de ponto flutuante, no que foi seguido pelo zsh, mas não pelo Bash e demais shells.

Eis um pequeno exemplo de programa em ksh93 usando aritmética de ponto flutuante.
#!/bin/ksh93

typeset -E a b # Define que as variáveis ‘a’ e ‘b’ vão guardar apenas dados de ponto flutuante.

a=0
((b=cos(a))) # Usa comando de avaliação aritmética para calcular o cosseno de 0
n=0

while ((a!=b)); do # Usa comando de avaliação aritmética para comparar os valores de a e b, e o seu código de retorno é usado pelo comando while para saber se continua executando o laço de repetição.
((a=b, b=cos(a), ++n)) # Comando de avaliação aritmética usando o operador “,”, para fazer três operações diferentes em sequência: copiar o valor de b para a, calcular o novo valor de b como sendo o cosseno de a, e incrementar o valor de n.
done
echo "$a=cos($a) após $n iterações."



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts