处理 Bash 中的浮点数

Handling Floating Point Number in Bash

有人可以协助我处理我在 bash 中需要的这个计算吗?

目前我有:

Size=$((IPS * DataPages / (1024 * 1024 * 1024) * 1.05))

但是我在尝试执行时遇到以下错误:

./buffer: line 20: IPS * DataPages / (1024 * 1024 * 1024) * 1.05: syntax error: invalid arithmetic operator (error token is ".05")

我愿意使用其他替代方法,例如 print 或 awk 甚至 bc,但我需要一些指导。

bash 不支持浮点运算。为此使用 bc。要在 bc 中启用浮点运算,请传递 --mathlib(或 -l)选项:

IPS=2
DataPages=3
bc --mathlib <<< "($IPS * $DataPages / (1024 * 1024 * 1024) * 1.05)"

要将其捕获到 shell 变量中,请使用进程替换:

...
Size=$(bc --mathlib <<< "($IPS * $DataPages / (1024 * 1024 * 1024) * 1.05)")

(( )) 不支持浮点运算。使用 bc 或 awk。

使用 bc

Size=$( echo "scale=2; $IPS * $DataPages / (1024 * 1024 * 1024) * 1.05 " | bc ) 
# scale is for number of digits after the floating point

使用 awk

Size=$( awk -v ips="$IPS" -v dp="$DataPages" 'BEGIN{size=ips * dp/ (1024 * 1024 * 1024) * 1.05; printf "%0.02f",size}' )