问题
我尝试在 Bash 脚本中将两个图像的宽度相除,但是 bash 给了我 0
作为结果:
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
(一款基础计算器程序)、awk
或 python
(通过命令行调用)等。
使用 bc 命令
使用 bc
进行浮点数运算的方式如下:
scale=2
result=$(echo "scale=$scale; 300 / 200" | bc)
echo $result
这段脚本会计算 300 / 200
并保留两位小数,结果将会是 1.50
。scale=$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