Eu tenho um script que usa valores flutuantes, mas de alguma forma não consigo subtrair dois valores flutuantes.
Este é o código de exemplo
#!/bin/bash
p="1"
h="10"
m=$(echo "3.5"| bc -l)
for (( c=$p; c<=$h; c++ ))
do
r=$(echo "($p-$m)"| bc -l)
echo "Z $c $m $r"
done
e este é o resultado
Z 1 3.5 -2.5
Z 2 3.5 -2.5
Z 3 3.5 -2.5
Z 4 3.5 -2.5
Z 5 3.5 -2.5
Z 6 3.5 -2.5
Z 7 3.5 -2.5
Z 8 3.5 -2.5
Z 9 3.5 -2.5
Z 10 3.5 -2.5
Responder1
Mude a linha
r=$(echo "($p-$m)"| bc -l)
para
r=$(echo "($c-$m)"| bc -l)
como não é $p
, mas $c
isso é alterado pelo loop.
Responder2
bash
não suporta aritmética de ponto flutuante. ksh
e zsh
fazer. POSIXly, você pode usar qualquer um bc
comoA resposta de Florianosugere, ou awk
. Por exemplo,
$ awk 'BEGIN{print 2.5+3.7}'
6.2
O Ubuntu também vem com Python
e Perl
que é mais do que capaz de realizar cálculos de ponto flutuante.
$ perl -le 'print(2.5+3.7)'
6.2
$ python3 -c 'print(2.5+3.7)'
6.2
Veja também uma lista bem extensa de outras opções:Como fazer cálculos inteiros e flutuantes, em bash ou outras linguagens/frameworks?
Observe também que de acordo comPadrão de linguagem POSIX Shellna expansão aritmética $((...))
:
Somente aritmética de inteiros longos assinados é necessária... Como extensão, o shell pode reconhecer expressões aritméticas além das listadas.
Portanto, a omissão da aritmética de ponto flutuante bash
e /bin/dash
está de acordo com as especificações POSIX.
Responder3
Sei que é tarde, mas como o resultado apareceu no Google, alguém pode ler isto. A solução é escrevê-lo como "$a- $b". O espaço faz com que funcione para mim.