在bash中进行浮点数运算时出现“无效的算术运算符”错误

41

这是我的脚本:

d1=0.003
d2=0.0008
d1d2=$((d1 + d2))

mean1=7
mean2=5
meandiff=$((mean1 - mean2))

echo $meandiff
echo $d1d2

但是我没有得到我预期的输出结果:

0.0038
2

我遇到了错误:Invalid Arithmetic Operator, (error token is ".003")?


1
顺便说一句,如果你从bash转换到ksh93,浮点数将会本地支持。 - Charles Duffy
5个回答

70

bash 不支持浮点数运算,需要使用像 bc 这样的外部工具。

# Like everything else in shell, these are strings, not
# floating-point values
d1=0.003
d2=0.0008

# bc parses its input to perform math
d1d2=$(echo "$d1 + $d2" | bc)

# These, too, are strings (not integers)
mean1=7
mean2=5

# $((...)) is a built-in construct that can parse
# its contents as integers; valid identifiers
# are recursively resolved as variables.
meandiff=$((mean1 - mean2))

它就是不行bash没有支持浮点运算的编写。 - chepner

13

另一种计算浮点数的方法是使用AWK舍入功能,例如:

a=502.709672592
b=501.627497268
echo "$a $b" | awk '{print $1 - $2}'

1.08218

1
这个答案好多了。 - dryleaf
1
绝佳的替代选择。 - Bil5
对我来说,yocto构建中没有bc命令。awk真是救星啊。谢谢 :) - Mohammad Yasir K P

6
如果您不需要浮点精度,可以简单地去掉小数部分。 echo $var | cut -d "." -f 1 | cut -d "," -f 1 此命令提取值的整数部分。两次使用cut是为了解析整数部分,因为某些区域设置可能使用点来分隔小数部分,而其他一些区域设置可能使用逗号。 编辑: 或者,为了自动化区域设置,可以使用localeecho $var | cut -d $(locale decimal_point) -f 1

实际上,您应该检查正确的分隔符。如果您只是简单地使用两个分隔符进行切割,在某些(例如美国?)以逗号表示千位分隔符,点号表示小数点的标准中可能会出现严重问题。您的脚本将把“1,005.3”切成1而不是1005。 - BUFU
1
@bufu 当然可以。实际上,可以通过locale来检查。我会更新我的答案。 - MTSan
我不知道有一个locale可以做到这一点。好的先生,我点了赞! - BUFU

1
你可以更改正在使用的 shell。如果你使用 bash shell 执行脚本 bash scriptname.sh,尝试使用 ksh 执行脚本。Bash 不支持涉及浮点数的算术运算。

0

bc 命令大喊一声 - 它真的救了我的一天!这是一个简单的答案,但它像魔法一样奏效。

a=1.1
b=1.1

echo $a + $b | bc -l
# Output:
2.2

#SUM
sum=$(echo $a + $b | bc -l) 
echo $sum
# Output
2.2

bc 是一个命令行计算器,可以让用户在终端上进行数学计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接