Como subtrair valores flutuantes em shell script

Como subtrair valores flutuantes em shell script

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 $cisso é alterado pelo loop.

Responder2

bashnão suporta aritmética de ponto flutuante. kshe zshfazer. POSIXly, você pode usar qualquer um bccomoA resposta de Florianosugere, ou awk. Por exemplo,

$ awk 'BEGIN{print 2.5+3.7}'
6.2

O Ubuntu também vem com Pythone Perlque é 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 bashe /bin/dashestá 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.

informação relacionada