Как вычесть значения плавающие в сценарии оболочки

У меня есть сценарий, который использует значения плавающие, но некоторые, как я не могу вычесть два плавания.

Это - пример кода

#!/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

и это - результат

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
1
задан 8 July 2015 в 19:46

2 ответа

Измените строку

   r=$(echo "($p-$m)"| bc -l)

к

   r=$(echo "($c-$m)"| bc -l)

, поскольку это не $p, но $c, который изменяется циклом.

2
ответ дан 7 December 2019 в 12:44

bash не поддерживает арифметику с плавающей точкой. ksh и zsh сделать. POSIXLy, Вы могли использовать также bc поскольку ответ Florian предлагает, или awk. Например,

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

Ubuntu также идет Python и Perl которые более, чем способны к выполнению вычислений с плавающей точкой.

$ perl -le 'print(2.5+3.7)'
6.2

$ python3 -c 'print(2.5+3.7)'
6.2

См. также очень обширный список других опций: Как сделать целочисленные и вычисления плавающие в ударе или других языках/платформах?

Обратите внимание также на это согласно POSIX стандарт Языка Shell в арифметическом расширении $((...)):

Только арифметика длинного целого со знаком требуется... Как расширение, оболочка может распознать арифметические выражения вне перечисленных.

Так пропуск арифметики с плавающей точкой от bash и /bin/dash соответствует спецификациям POSIX.

1
ответ дан 7 December 2019 в 12:44

Другие вопросы по тегам:

Похожие вопросы: