Altere a linha
r=$(echo "($p-$m)"| bc -l)
para
r=$(echo "($c-$m)"| bc -l)
como não é $p
mas $c
que é alterado pelo loop.
Eu tenho um script que usa valores float, mas alguns como eu não sou capaz de subtrair dois carros alegóricos.
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
Altere a linha
r=$(echo "($p-$m)"| bc -l)
para
r=$(echo "($c-$m)"| bc -l)
como não é $p
mas $c
que é alterado pelo loop.
bash
não suporta aritmética de ponto flutuante. ksh
e zsh
do. POSIXLy, você poderia usar bc
como a resposta de Florian sugere, ou awk
. Por exemplo,
$ awk 'BEGIN{print 2.5+3.7}'
6.2
O Ubuntu também vem com Python
e Perl
, que são mais do que capazes 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 extensa de outras opções: Como fazer inteiro & amp; cálculos de flutuação, em bash ou outras linguagens / frameworks?
Note também que de acordo com o padrão POSIX Shell Language na expansão aritmética $((...))
:
Portanto, a omissão da aritmética de ponto flutuante de bash
e /bin/dash
está de acordo com as especificações POSIX.