使用 GNU bc 在 Linux Shell 中进行数学运算
创始人
2024-03-02 05:40:16
0

在 shell 中使用 bc 更好地做算数,它是一种用于高级计算的数学语言。

大多数 POSIX 系统带有 GNU bc,这是一种任意精度的数字处理语言。它的语法类似于 C,但是它也支持交互式执行语句和处理来自标准输入(stdin)的数据。因此,它通常是以下问题的答案:“我如何在 Linux shell 中进行数学运算?”这种回应方式在网上很常见:

$ echo "1+1" | bc
2

尽管这是完全正确的,但很少有用户认为,与更直观的方式相比,它很优雅,例如:

$ 1+1  # 这不能工作
2

交互模式要容易一些:

$ bc
1+1
2
quit
$

但是交互模式并不总是适合简单计算想要的直观工作流,比如直接输入你想要的计算。因此我推荐 Bluebat 的纯 Bash 计算器

bc 实际上提供了一种用于高级计算的数学语言。

含高级函数的 mathlib

bc 本身提供了基本的数学函数。你可以在交互式模式下测试它们:

$ bc
3^2
9
(3^2)*(9)/3
27

使用 --mathlib 选项获取高级函数,包括正弦、余弦、正切等。在交互式模式下,你可以测试其中一些。下面是 90 度的余弦:

c(90)
-.44807361612917015236

9 的正弦:

s(9)
.41211848524175656975

创建你自己的 bc 函数

你还可以在 bc 中创建自己的函数。函数定义以 define 关键字开始,并用大括号括起来。下面是一个输入到交互式会话中的简单函数,它返回给它的任意数字:

$ bc
define echo(n) {
  return (n);
}

在同一个交互式会话中,测试一下:

echo(2)
2
echo(-2)
-2

bc 中的 if 语句

bc 语言还有各种控制语句,其中最简单的是 if/else。语法乍一看可能很熟悉,但在如何处理大括号方面有些不同。请注意,if 语句的 else 子句包含在大括号中,而 then 子句不是,但两者都用分号终止。下面是一个返回数字 n 的绝对值的函数:

define abso(n) {
  if ( n > 0 ) return (n);
  { return (-n); }
}

在同一个交互式会话中,测试一下:

abso(-5)
5
abso(5)
5

将数据导入 bc

使用交互式会话对于快速计算和实验是可以容忍的,但在退出时会丢失数据,并且在出错时很难编辑。幸运的是,bc 可以从外部文件加载变量和函数。

下面是一个包含两个变量(solfoo)的文件,以及一个用于查找绝对值的自定义 abso 函数:

sol=299792458

foo=42

define abso(n) {
  if ( n > 0 ) return (n);
  { return (-n); }
}

将它保存到名为 bcvars.bc 的文件中,以便导入 bc 交互式会话:

$ bc bcvars.bc
foo
42
sol
299792458
abso(-23)
23

使用 bc 助力你的数学

bc 语言相对简单,前提是你知道足够的数学知识来构造任何你想完成的方程。虽然 bc 默认提供了有用的基本函数,并允许你创建自己的函数,但你可以通过站在巨人的肩膀上来减少工作量。加载了用于数学基础知识和特定任务(例如,计算复利)的新函数的文件可从 GNU bc 页获得,同时也可获得 bc 完整文档

如果你有兴趣在 shell 里更好地处理数学,试试 bc 。它不会使你成为数学天才,但它可能会让过程更简单。


via: https://opensource.com/article/20/7/bc-math

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

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

相关内容

开源打破“AI黑箱”!集结...
都说我们正处在 AI 最好的时代。到了 2026 年,这句话已经不...
2026-05-06 20:25:16
中科院破解AI学习难题:为...
这项由中科院多模态人工智能系统国家重点实验室和中科院大学人工智能学...
2026-04-05 10:45:29
一个困扰物理学家15年的问...
大家好,我是科学羊! 先说一个你可能没想到的事实。 物理学家研究宇...
2026-03-30 09:49:22
AI驱动保险承保技术获突破...
AI保险承保技术多年来一直被称为保险科技的下一个前沿领域。如今的不...
2026-03-11 08:04:57
谷歌 Gemini 攻克「...
Google Research 团队用 Gemini Deep T...
2026-03-08 09:52:25

热门资讯

“Linux 中国” 开源社区... 这是一个艰难的决定 —— 这不是调侃,而是当你真正做出改变了你十几年生活轨迹的决定时,你就会明白这个...
硬核观察 #1263 德国铁路... #1 德国铁路公司招聘 Windows for Workgroups 3.11 管理员该职位要求了解...
人工智能教程(七):Sciki... 在本系列的 上一篇文章 中,我们用 TensorFlow 构建了第一个神经网络,然后还通过 Kera...
关闭 WSL 中正在运行的 L... 以下是使用 WSL 关闭在 Windows 内运行的 Linux 系统的不同方法。你使用 WSL 在...
MX Linux 23.2 “... 最新的 MX Linux 23.2 小版本更新带来了基本的改进和新增功能。MX Linux 推出了 ...
硬核观察 #1262 网络上最... #1 网络上最古老的软件存档库之一即将关闭美国新墨西哥州立大学(NMSU)最近宣布,即将于 2024...
如何在 RHEL 上通过绑定配... 在 Linux 中,你可以根据自己的需要创建高级网络设置,如 网络绑定 Network Bondin...
Linux Matrix 消息... Matrix 用户可以升级 Fractal 6 了!Fractal 是目前 最好的 Matrix 客...
如何通过 VLC 使用字幕 使用 VLC 媒体播放器播放和管理字幕的新手指南。我是一个超级动漫迷,如果你想观看最新的剧集,那么你...
硬核观察 #1261 X 计划... #1 X 计划在奥斯汀建立内容审核总部据报道,该部门将招聘 100 名全职员工,将主要关注 CSE ...