在Bash中如何使用浮点数运算?

2024-06-06 15:59:25 浏览数 (1)

问题

我尝试在 Bash 脚本中将两个图像的宽度相除,但是 bash 给了我 0 作为结果:

代码语言:javascript复制
RESULT=$(($IMG_WIDTH/$IMG2_WIDTH))

我确实研究了 Bash 指南,我知道我应该使用 bc,在互联网上的所有示例中他们都使用 bc。在echo中我尝试放入我的 SCALE,但是它没有工作。

这是我在教程中找到的例子:

代码语言:javascript复制
echo "scale=2; ${userinput}" | bc

我怎样才能让 Bash 给我一个像 0.5 这样的浮点数?

回答

Bash shell 本身并不直接支持浮点数运算。Bash 是基于整数的,它的算术扩展 $(( expression )) 主要用于整数运算,并且不会自动处理浮点数。

如果你想在 Bash 脚本中进行浮点数运算,你可以借助一些外部工具或命令,如 bc(一款基础计算器程序)、awkpython(通过命令行调用)等。

使用 bc 命令

使用 bc 进行浮点数运算的方式如下:

代码语言:javascript复制
scale=2
result=$(echo "scale=$scale; 300 / 200" | bc)
echo $result

这段脚本会计算 300 / 200 并保留两位小数,结果将会是 1.50scale=$scale 设置了 bc 的小数点后保留位数。这样,你就可以在 Bash 脚本中实现浮点数的计算了。

如果你想要更高的精度,可以设置更高的精度,例如:

代码语言:javascript复制
scale=6

这将设置 bc 的精度为 6 位小数。根据你的需要调整 scale 的值即可。

或者以数学库模式运行:

代码语言:javascript复制
result=$(echo "300 / 200" | bc -l)
echo $result

需要注意的是不是所有的 Linux 发行版都会默认安装 bc 命令行计算器工具。如果你发现系统中没有预装 bc,需要先安装再使用。

使用 awk 命令

使用 awk 来进行两个数的除法运算,可直接从管道输入中读取这两个数。

代码可以写为:

代码语言:javascript复制
echo "$IMG_WIDTH $IMG2_WIDTH" | awk '{printf "%f n", $1/$2}'

使用 python 命令

Python2 在2020年1月1日已经正式停止支持,这意味着它不再接收安全更新或错误修复,而且许多库和工具也在逐步放弃对 Python2 的支持。Python3 不仅包含了对Python2 中大部分功能的改进,还引入了许多新特性,提高了代码的可读性、安全性,并增强了对现代编程需求的支持,比如更好的字符串处理、更清晰的语法糖、asyncio 异步编程等。

为实现提问者需求,代码可以写为:

代码语言:javascript复制
IMG_WIDTH=100
IMG2_WIDTH=200
python3 -c "print($IMG_WIDTH / $IMG2_WIDTH)"

或者

代码语言:javascript复制
IMG_WIDTH=100
IMG2_WIDTH=200
echo "print($IMG_WIDTH / $IMG2_WIDTH)" | python3

参考

  • stackoverflow question 12722095
  • man bc

0 人点赞