在expr中使用浮点数的Shell脚本

7

我正在尝试从以下内容中获取一个浮点数:

totalmark=$(expr $sum / $subjects )

这是正确的吗?

4个回答

13

bash不支持浮点数,可以使用awk或bc/dc。

例如,使用awk:

totalmark=$(awk 'BEGIN{print $sum / $subjects}')

或者bc

totalmark=$(echo "scale=2;$sum/$subjects"|bc)

如果你有使用除了bash以外的其他shell的机会,可以尝试使用zsh或ksh。

$ zsh -c 'echo $((4/1.3))'
3.0769230769230766

$ ksh -c 'echo $((4/1.3))'
3.07692307692307692

@ghostdog:说得好,但是谁在客户端安装了php呢?事实上,我看到它在Mac OS上是默认安装的;我相信苹果有它的理由... - Charles Stewart
@ghostdog:既然我已经偏离主题了...在我看来,不久前perl -e oneliners是大多数人处理这些事情的方式。如今,Perl似乎在某种程度上被取代了。 - Charles Stewart
感谢您的 zsh 答案!我不知道为什么无法弄清楚如何做到这一点。 - weronika
awk 和 bc 哪个更好、更快? - Nabi K.A.Z.
@NabiK.A.Z.,无论哪种情况,大部分时间都花在启动工具上——运行它所需的时间相对较短——而且大部分启动时间(fork、exec、链接器/加载器)都涉及到任何外部工具,因此我不会期望有显著差异(尽管是否在实践中看到差异取决于您操作系统提供的awk和bc的具体实现,它们链接到哪些库等等——因此如果您真的需要答案,您需要进行基准测试)。 - Charles Duffy

5

我认为Bash没有浮点数的功能。你可以尝试以下方法:

echo "$sum/$subjects" | bc -l

3

Bash不支持浮点数算术运算。请尝试使用bc


2
totalmark=$(echo "scale=4;$sum/$subjects"|bc)

顺便提一下,有三个答案说Bash不支持浮点运算。虽然这是正确的,但expr是一个外部程序(对于我来说是/usr/bin/expr),特别是在这种情况下不支持浮点数。


GNU bc 默认的精度为scale=0,Q 不需要这个。使用 -lq 选项传递参数。 - Charles Stewart
@Charles:这就是为什么我指定了一个4的比例尺。它可以是你想要的任何东西。 --mathlib选项(-l)提供了一个默认值为scale = 20(至少在我的系统上,使用bc 1.06.94)。不过,--quiet选项是个好主意。 - Dennis Williamson
不好意思:我没有注意到你已经将任务提交到输入中-可能是我在发呆。scale=20是过度强大了,但所需的信息在那里,我倾向于在输出中有噪音而不是在shell脚本中有噪音。 - Charles Stewart

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