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

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

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

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

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

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

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

к

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

как бы это не было, $pно $cэто изменяется циклом.

решение2

bashне поддерживает арифметику с плавающей точкой. kshи zshделает. POSIXLy, вы можете использовать любой из них bcкакОтвет Флорианапредполагает, или 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

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

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

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

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

решение3

Я знаю, что это поздно, но поскольку результат появился в Google, кто-то может это прочитать. Решение — написать это как "$a- $b". Пробел позволяет мне это сделать.

Связанный контент