Linux bc 命令:在终端里做数学计算的“瑞士军刀”
你有没有遇到过这样的场景?在 Linux 终端里写脚本,需要做几个浮点数运算,比如计算平均分、百分比、汇率转换……结果发现 expr 或 awk 有点不够用,连小数都算不准。这时候,Linux bc 命令 就是你最值得信赖的伙伴。
它不像 expr 那样只支持整数,也不像 awk 那样需要额外学习语法。bc 是一个任意精度的计算器语言,支持小数、科学计数法、变量、函数,甚至还能写循环。它就像你随身携带的计算器,但比手机上的更强大、更灵活。
接下来,我会带你从零开始掌握 Linux bc 命令,从最基础的用法到进阶技巧,全部用真实代码演示,保证你看懂、能用、会用。
基础用法:直接在命令行做计算
bc 最简单的用法,就是直接在终端输入表达式。它会立刻返回计算结果。
echo "10 + 5 * 3" | bc
💡 注释:
echo将表达式传给bc,|是管道符,把输出作为输入。这个命令会输出25,因为bc会按数学规则先算乘法再加法。
你也可以直接启动 bc 交互模式,输入完表达式按回车即可:
bc
进入后,输入:
5 + 7 * 2
按下回车,输出:
19
📌 小提示:在交互模式下,你可以连续输入多个表达式,
bc会逐个计算。按Ctrl + D退出。
支持小数:告别整数计算的局限
expr 只能处理整数,比如 expr 5 / 2 返回 2,但你真正想要的是 2.5。bc 正好解决了这个问题。
echo "5 / 2" | bc
💡 注释:这个命令输出
2,因为默认精度是 0,即不保留小数。如果要保留小数,需要设置scale变量。
echo "scale=2; 5 / 2" | bc
💡 注释:
scale=2表示保留两位小数。5 / 2结果是2.50。scale是bc的关键参数,控制小数点后保留几位。
你还可以设置更多位数:
echo "scale=4; 10 / 3" | bc
💡 注释:输出
3.3333,即 10 除以 3 的前四位小数。scale越大,精度越高,但计算时间也略长。
变量与表达式:让计算更有“记忆”
bc 支持变量,就像你在编程中用的变量一样。
echo "a = 10; b = 3; a * b + 5" | bc
💡 注释:这里定义了变量
a和b,然后计算a * b + 5,结果是35。注意:变量赋值用=,表达式之间用分号分隔。
你也可以在交互模式中操作:
bc
a = 15
b = 4
c = a / b
c
💡 注释:输入
c后,bc会输出3.75,前提是scale已经设置为至少 2。
函数定义:把常用计算封装起来
bc 支持函数定义,你可以把常用的数学运算封装成函数,像写脚本一样复用。
echo '
define square(x) {
return x * x
}
square(5)
' | bc
💡 注释:
define square(x)定义一个名为square的函数,参数是x。函数体用大括号包裹,return返回结果。调用square(5)输出25。
你还可以写更复杂的函数,比如计算圆面积:
echo '
define area_of_circle(r) {
scale = 4
pi = 3.1416
return pi * r * r
}
area_of_circle(3)
' | bc
💡 注释:这个函数计算半径为 3 的圆面积,结果是
28.2744。注意scale = 4在函数内部设置精度,避免影响全局。
循环与条件:让 bc 也能“写程序”
别小看 bc,它支持 for 循环和 if 条件判断,可以实现简单的逻辑控制。
for 循环:遍历数字
echo '
for (i = 1; i <= 5; i++) {
print i, " squared is ", i * i, "\n"
}
' | bc
💡 注释:
for (i = 1; i <= 5; i++)表示从 1 开始,每次加 1,直到 i 大于 5 停止。\n是换行符。输出如下:
1 squared is 1
2 squared is 4
3 squared is 9
4 squared is 16
5 squared is 25
if 条件判断:判断奇偶数
echo '
n = 7
if (n % 2 == 0) {
print "Even\n"
} else {
print "Odd\n"
}
' | bc
💡 注释:
%是取模运算,n % 2 == 0判断是否为偶数。输出Odd,因为 7 是奇数。
实用场景:在脚本中使用 bc
bc 最大的价值,是在 shell 脚本中做高精度计算。比如计算文件大小、内存使用率、百分比等。
场景 1:计算两个数字的百分比
#!/bin/bash
total=250
part=87
percentage=$(echo "scale=2; (part * 100) / total" | bc)
echo "占比:$percentage%"
💡 注释:这个脚本计算
87 / 250 * 100,结果是34.80%。scale=2确保小数点后保留两位。
场景 2:转换温度(摄氏度转华氏度)
#!/bin/bash
celsius=25
fahrenheit=$(echo "scale=1; celsius * 9 / 5 + 32" | bc)
echo "$celsius°C = $fahrenheit°F"
💡 注释:公式是
F = C × 9/5 + 32。输出25°C = 77.0°F。scale=1保留一位小数。
高级技巧:设置默认精度和自定义函数库
你可以通过环境变量或配置文件,让 bc 默认启用某些设置。
设置全局 scale
在你的 shell 配置文件(如 ~/.bashrc)中添加:
export BC_ENVIRONMENT=1
然后创建 ~/.bcrc 文件,写入:
scale = 4
这样每次启动 bc,都会自动加载这个文件,scale 默认为 4。
使用自定义函数库
你可以把常用函数保存为一个文件,比如 math.bc:
define factorial(n) {
if (n <= 1) return 1
return n * factorial(n - 1)
}
define gcd(a, b) {
while (b != 0) {
temp = b
b = a % b
a = temp
}
return a
}
然后在脚本中使用:
echo "factorial(5)" | bc -l math.bc
💡 注释:
-l参数加载数学库(包含s,c,l等函数),math.bc是自定义函数文件。输出120。
常见问题与注意事项
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 小数结果是整数 | scale 未设置 |
添加 scale=2 |
| 表达式错误 | 缺少分号或括号 | 用 ; 分隔语句,{} 包裹块 |
| 无法使用变量 | 未赋值或拼写错误 | 检查变量名是否一致 |
不能用 if |
语法错误 | 确保 if (条件) { } 格式正确 |
总结
Linux bc 命令 不只是一个计算器,它是一个功能完整的脚本语言,特别适合在 shell 脚本中做高精度数学计算。它支持变量、函数、循环、条件判断,甚至可以加载自定义函数库。
无论你是初学者还是中级开发者,掌握 bc 都能让你在处理数值计算时更加得心应手。它不依赖图形界面,不占用资源,运行在终端中,响应迅速,是 Linux 工具链中不可替代的“瑞士军刀”。
下次你再遇到浮点数计算问题,别再用 expr 或 awk 勉强应付了。试试 Linux bc 命令,它会让你的脚本更专业、更准确。