怎么样称得上是Linux下优秀的命令行计算器

Dan Nanni 的头像

·

·

·

17,620 次阅读

每个现代的Linux桌面发行版都预装着一个带有图形界面的计算器程序。不过如果你的工作区中全是命令行窗口,那么你一定会在其中的一个命令行窗口中处理一些数字相关的问题。或许你在寻找一款基于命令行的计算器程序。如果是这样的话,GNU bc(“basic calculator”的缩写)会是你不二的选择。当然Linux下有很多基于命令行的计算器应用,我认为GNU bc是功能最强大和最有用的。

在GNU时代之前,bc实际上是一个著名的精密计算语言。它的诞生要追溯到70年代的Unix时期了。最初bc作为一个语法和C语言相似的编程语言而著名。随着时间的改变,最开始的bc演化成POSIX bc,最后变成了今天的GNU bc。

GNU bc的特性

现在的GNU bc是早期bc经过若干次改进和功能增强的结果。目前它被所有的主流GNU/Linux发行版所收纳。GNU bc支持高精度数字和多种数值类型(例如二进制、十进制、十六进制)的输入输出。

如果你对C语言很熟悉的话,你会发现bc使用了和C语言一样或相似的算术操作符。所支持的操作符包括算术运算符(+, -, *, /, %, ++, –)、比较运算符(<, >, ==, !=, <=, >=)、逻辑运算符(!, &&, ||)、位运算符(&, |, , ~, <<, >>)和复合赋值运算符(+=, -=, *=, /=, %=, &=, |=, =, &&=, ||=, <<=, >>=)。bc内置了很多有用的函数,像是平方根、正弦、余弦、反正弦、自然对数、指数等。

如何使用GNU bc

作为一个基于命令行的计算器,GNU bc的使用没有限制。在本文中,我会向大家介绍bc命令的几个常用的特性。如果你想要更加详细的指导,你可以查阅官方指南

如果你没有一个预先写好的bc脚本,那么你可以在交互模式下运行bc。在这种模式下,你输入的以回车结束的任何声明或者表达式会被立刻计算出结果。你需要输入以下命令来进入bc的交互界面。如果想退出bc,你可以输入’quit’并且按回车。

$ bc 

本文下面展示的例子请在bc交互界面中输入。

输入表达式

如果想要计算一个算术表达式,我们可以在闪烁的光标处输入该表达式,然后按回车确认。你也可以将该结果存储到一个变量中,然后在其他表达式中使用该变量。

在一个bc的交互界面中,保存着没有个数限制的命令历史记录。使用上方向键来查看之前输入的命令。如果你想限制历史记录保存的命令数量,你可以将一个名为history的特殊变量设置成你希望的数值。该变量默认为-1,也就是“历史记录数量没有限制”。

输入输出进制切换

经常会发生的是,你输入一个表达式并且想使用二进制或者十六进制来显示结果。bc允许你在输入输出数字的进制间转换。输入和输出的数系基分别存储在ibase和obase变量中,默认值为10,有效的数值是2到16(或者环境变量BCBASEMAX的值)。你只需要更改ibase和obase的值就可以在不同进制之间转换了。下面是一个求两个十六进制/二进制数和的例子:

需要注意的是,我有意地将obase=16放到了ibase=16前面,反过来则是不可以的。这个是因为如果我先输入ibase=16,那么随后输入的obase=16中的16会被认为是16进制的数字,也就是十进制的22。当然这个不是我们所期望的。

调整精度

在bc中,数字的精度存储在一个名为scale的特殊变量中。该变量表示小数点后数字的个数。scale默认为0,意味着所有的数字和结果以整数形式储存。你可以通过改变scale这个特殊变量的值,来调整数值的精度。

scale=4 

使用内置函数

除了简单的算术操作符,GNU bc还通过外部的数学函数库来提供许多高级的数学函数。你可以在命令行界面使用“-l”选项来打开bc。

这里描述了一些内置的函数。

N的二次方根:

 sqrt(N) 

X的正弦(X是弧度):

s(X)

X的余弦(X是弧度):

c(X)

X的反正弦(返回值是弧度):

a(X)

X的自然对数:

l(X)

X的指数对数:

e(X) 

当做语言来用

作为一个计算语言,GNU bc支持简单的声明(变量赋值、中断、返回等)、复合语句(if、while、for loop等)和自定义函数。在这里我不会涉及到这些特性的细节,不过你可以通过官方指南来学习如何使用这些特性。下面是一个简单的函数示例:

define dummy(x){
return(x * x);
}
dummy(9)
81
dummy(4)
16 

在非交互界面下使用GNU bc

到目前为止,我们一直在交互界面下使用bc。不过更加流行的使用bc的方法是在没有交互界面的脚本中运行bc。这种情况下,你可以使用echo命令并且借助管道来向bc发送输入内容。例如:

$ echo "40*5" | bc
$ echo "scale=4; 10/3" | bc
$ echo "obase=16; ibase=2; 11101101101100010" | bc

总结一下,GNU bc是一款强大并且通用的基于命令行的计算器应用,它绝对不会让你失望。它预装在所有的现代Linux发行版中,bc可以让你不用离开命令行就可以进行高效的数学计算。所以,GNU bc一定会是你的最爱。


via: http://xmodulo.com/command-line-calculator-linux.html

作者:Dan Nanni 译者:JonathanKang 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

29 条回复

  1. 微博评论 的头像
    微博评论

    用Python当计算器用好了。

    来自南京
  2. 微博评论 的头像
    微博评论

    不会写python 只会用python 解释器下做加减法的捂脸飘过[拍砖][互相拍砖]

    来自南京
  3. 微博评论 的头像
    微博评论

    python足矣

    来自南京
  4. 微博评论 的头像
    微博评论

    irb//@Murakumo叢雲: 转发微博

    来自厦门
  5. 微博评论 的头像
    微博评论

    irb //@人家要变成奶酪了:irb//@Murakumo叢雲: 转发微博

    来自厦门
  6. 微博评论 的头像
    微博评论

    我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自长沙
  7. 微博评论 的头像
    微博评论

    sympy巨爽//@Linux中国:我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自长沙
  8. 微博评论 的头像
    微博评论

    我说一个笑话,现在还有人用perl[哈哈] 是不是很黑?//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自长沙
  9. 微博评论 的头像
    微博评论

    一直用python//@Linux中国:我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自长沙
  10. 微博评论 的头像
    微博评论

    看来bc好强大,以前还用PHP,MySQL呢,得h改行了。 //@Linux中国:我是用perl//@西安气象爱好者:用Python当计算器用好了。

  11. 微博评论 的头像
    微博评论

    烧死perl→_→//@Linux中国:我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自上海
  12. 微博评论 的头像
    微博评论

    bc确实不错,可惜以前不会玩

    来自上海
  13. 微博评论 的头像
    微博评论

    簡單的用echo $((exp)),複雜一點用bc,再複雜一點用ipython notebook//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

  14. 微博评论 的头像
    微博评论

    awk也轻松搞定。awk ‘BEGIN{print 1.1*1.01}’//@Linux中国://@farseerfc:簡單的用echo $((exp)),複雜一點用bc,再複雜一點用ipython notebook//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自莆田
  15. 微博评论 的头像
    微博评论

    好吧,各路语言都出来秀秀吧[汗]//@挨弹腿踢梁昌泰:awk也轻松搞定。awk ‘BEGIN{print 1.1*1.01}’//@Linux中国://@farseerfc:簡單的用echo $((exp)),複雜一點用bc,再複雜一點用ipython notebook//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自莆田
  16. 微博评论 的头像
    微博评论

    对我来说,bc就足够应付了。

    来自莆田
  17. 微博评论 的头像
    微博评论

    //@Linux中国:好吧,各路语言都出来秀秀吧[汗]//@挨弹腿踢梁昌泰:awk也轻松搞定。awk ‘BEGIN{print 1.1*1.01}’//@Linux中国://@farseerfc:簡單的用echo $((exp)),複雜一點用bc,再複雜一點用ipython notebook//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

  18. 微博评论 的头像
    微博评论

    bc太难用了,pythonpy, pyeval, pyli这几个基于python的命令行工具好多了

  19. 微博评论 的头像
    微博评论

    我直接用Matlab,M语言算不算?

    来自江门
  20. 微博评论 的头像
    微博评论

    我一般用scheme //@西瓜大丸子汤:bc太难用了,pythonpy, pyeval, pyli这几个基于python的命令行工具好多了

    来自江门
  21. 微博评论 的头像
    微博评论

    Linux中国:【怎么样称得上是Linux下优秀的命令行计算器 | 每个现代的……】

  22. 微博评论 的头像
    微博评论

    python大法好//@Linux中国: 好吧,各路语言都出来秀秀吧[汗]//@挨弹腿踢梁昌泰:awk也轻松搞定。awk ‘BEGIN{print 1.1*1.01}’//@Linux中国://@farseerfc:簡單的用echo $((exp)),複雜一點用bc,再複雜一點用ipython notebook//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

  23. 朩ダo○ 的头像
    朩ダo○

    很不错哦,以前就关注到了bc,当时一个很困惑的地方就在于,默认情况下,计算结果的小数位数为0,而我一时也找不到在哪里调,简单翻了下man手册,写的太啰嗦咯,木有耐心的我就木有看完,现在可好咯,原来只要简单的使用一下scale=xx就可以咯.很不错.一个很有用的命令行计算工具.个人感觉比python用起来简单多咯,而且用起来更像计算器的感觉嘛

    来自镇江
  24. 微博评论 的头像
    微博评论

    作为命令行控,这个得转//@西瓜大丸子汤: bc太难用了,pythonpy, pyeval, pyli这几个基于python的命令行工具好多了

  25. 微博评论 的头像
    微博评论

    用ruby也行啊~//@Linux中国:好吧,各路语言都出来秀秀吧[汗]//@挨弹腿踢梁昌泰:awk也轻松搞定。awk ‘BEGIN{print 1.1*1.01}’//@Linux中国://@farseerfc:簡單的用echo $((exp)),複雜一點用bc,再複雜一點用ipython notebook//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自泉州
  26. 微博评论 的头像
    微博评论

    不错不错,很强大

    来自杭州
  27. 微博评论 的头像
    微博评论

    当然用js,任何平台浏览器F12就有输入框,全世界最方便的输入方式 //@Linux中国:好吧,各路语言都出来秀秀吧[汗]//@挨弹腿踢梁昌泰:awk也轻松搞定。awk ‘BEGIN{print 1.1*1.01}’//@Linux中国://@farseerfc:簡單的用echo $((exp)),複雜一點用bc,再複雜一點用ipython notebook//@Linux中国: 我是用pe

    来自兰州
  28. 微博评论 的头像
    微博评论

    一般都用python//@Linux中国:好吧,各路语言都出来秀秀吧[汗]//@挨弹腿踢梁昌泰:awk也轻松搞定。awk ‘BEGIN{print 1.1*1.01}’//@Linux中国://@farseerfc:簡單的用echo $((exp)),複雜一點用bc,再複雜一點用ipython notebook//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

    来自北京
  29. 微博评论 的头像
    微博评论

    我才不会告你你们我的计算机叫Macaulay2呢[哈哈]//@Linux中国: 我是用perl//@西安气象爱好者:用Python当计算器用好了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注