Como subtrair valores float no shell script

1

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
    
por Eka 08.07.2015 / 18:46

2 respostas

2

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.

    
por Florian Diesch 08.07.2015 / 18:54
1

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 $((...)) :

% bl0ck_qu0te%

Portanto, a omissão da aritmética de ponto flutuante de bash e /bin/dash está de acordo com as especificações POSIX.

    
por Sergiy Kolodyazhnyy 28.05.2018 / 02:03