如何将bc的结果传递给变量


15

我正在编写脚本,我想将结果从中传递bc到变量中。我已经声明了2个变量(var1var2),并给了它们值。在我的脚本中,我希望将结果从bc另一个变量中传递出去,var3以便可以var3用于其他计算。到目前为止,我已经能够将结果写到不是我想要的文件中,而且我已经能够在终端中回显结果,但是我只想暂时将结果传递给变量,以便我可以使用该变量。

echo "scale=2;$var1/var2" | bc

Answers:


23

如果您正在使用bash,则最好使用here字符串而不是管道,如下所示:

bc <<< "scale=2;$var1/$var2"

这将为您节省一个子外壳。

然后,要存储命令的输出,请使用命令替换:

answer=$(bc <<< "scale=2;$var1/$var2")

编辑。

如果您想要比还要酷的东西bc,请使用dc(反向抛光计算器):

answer=$(dc <<< "2k $var1 $var2/p")

1
是的,我正在使用bash,请您在子shell上进行说明吗?有缺点吗?
shaolin 2012年

2
每次使用管道时,管道|右侧的命令都会在子外壳程序中执行,并且需要花费资源才能打开新的子外壳程序(就像打开新的bash实例来执行该命令一样)。如果可以避免,请避免。在这里,将an echo传递给管道bcbc在子shell中运行命令,并且从某种意义上说,它是被延迟的(无犯罪),因为bash具有出色的here-string结构<<<来避免此类愚蠢的事情。
gniourf_gniourf

@gniourf_gniourf再说一遍,如果您关心资源使用情况,可以使用/bin/sh(dash)代替bash,但是dash没有<<<
吉尔斯(Gillles)“所以-别再作恶了”

感谢您提供有用的信息!!这是有关保留资源和子外壳的好信息。非常感谢您的投入。
shaolin 2012年

1
@Gilles只是比较time for i in {1..10000}; do : <<< ""; donetime for i in {1..10000}; do echo "" | : ; done,你会看到一个显着的差异。然后,您说对了,heredoc比herestring快一点。但是将其作为单线打印比较麻烦。
gniourf_gniourf 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.