У меня есть скрипт, который использует значения с плавающей точкой, но по какой-то причине я не могу вычесть два числа с плавающей точкой.
Это пример кода
#!/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". Пробел позволяет мне это сделать.