如何在我的Bash脚本中替换'bc'工具?

3

我有以下命令在我的bash脚本中:

printf '\n"runtime": %s' "$(bc -l <<<"($a - $b)")"

我需要在大约100个服务器上运行此脚本,但是我发现其中有几台服务器没有安装bc。我不是管理员,也无法在缺失的服务器上安装bc

在这种情况下,我可以使用什么替代方法来执行相同的计算?请告诉我新命令应该是什么样子。


使用一种解决方法,可以在不安装的情况下使用 bc 功能的子集:您的发行版的 init(cpio|ramfs|rd) 机制应该提供一个 busybox 二进制文件,其中可能启用了 bc applet。例如,在 Arch 上,软件包 linux 依赖于 mkinitcpio-busybox。后者提供了 /usr/lib/initcpio/busybox,并且 $ /usr/lib/initcpio/busybox bc <<<"33-22" 可以得到 11 - Darren Ng
2个回答

7

如果您需要适用于浮点数运算的解决方案,您可以随时转向 Awk。

awk -v a="$a" -v b="$b" 'BEGIN { printf "\n\"runtime\": %s", a-b }' </dev/null

将代码放在BEGIN块中,并将输入重定向到/dev/null是一种常见的解决方法,当您想要使用Awk但没有要循环处理的行文件时,这就是它真正设计的用途。

哦,抱歉,忘记了逗号——现在已经更新了。感谢您的耐心等待。 - tripleee

5
如果你只涉及整数,你可以使用bash的算术扩展来实现这个功能:
printf '\n"runtime": %s' $((a - b))

请注意,这假定您有可用的bash(正如您已经指示的那样)。如果您只有削减版的Bourne shell(/bin/sh),则无法使用算术扩展。

这意味着您在所有远程服务器上都有Bash或类似的shell。 OP可能会(毕竟,他们使用了<<<here strings),但仍然值得指出。 - tripleee
2
@tripleee,鉴于他们在问题中标记了“bash”,并在标题中明确提到了“bash脚本”,因此这似乎是一个安全的假设。 - Turn
当然,只是很多访客可能会感到困惑,“shell脚本”和“Bash脚本”不一定是同义词。我考虑的是未来的访客,而不是原帖作者。 - tripleee
在算术上下文中,实际上不需要在变量 ab 前加美元符号。 - tripleee
6
$((..)) 是 POSIX,所以这不是问题。我更担心需要支持非整数。 - that other guy
显示剩余2条评论

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