什麼是 bc?
bc (Basic Calculator) 是 Linux/Unix 系統內建的任意精度計算器語言。支援整數、浮點數、進位制轉換、數學函數、邏輯運算與程式化控制流,是終端機、腳本與管道運算的首選工具。
啟動與退出
$ bc # 進入互動模式
$ bc -l # 載入標準數學庫(sin, cos, sqrt 等)
$ bc -q # 安靜模式(不顯示版權資訊)
# 退出
quit
# 或 Ctrl+D
基礎運算
| 運算子 | 功能 | 範例 | 結果 |
+ | 加法 | 2+5 | 7 |
- | 減法 | 7-2 | 5 |
* | 乘法 | 3*4 | 12 |
/ | 除法(整數除法) | 3/4 | 0 |
^ | 冪次 | 2^3 | 8 |
% | 取模(餘數) | 6%5 | 1 |
精度控制:scale 變數
bc 預設整數運算,scale 定義小數點後位數(預設 0)。
scale=3
3/4
.750
scale=10
sqrt(2)
1.4142135623
# 臨時指定精度
echo "scale=5; 22/7" | bc
3.14285
進位制轉換:ibase / obase
數學函數(需 bc -l)
| 函數 | 功能 | 範例 |
s(x) | 正弦(弧度) | s(3.14159/2) → 1 |
c(x) | 餘弦(弧度) | c(0) → 1 |
a(x) | 反正切(弧度) | a(1)*4 → π 約 3.14159 |
l(x) | 自然對數 | l(2.71828) → 1 |
e(x) | 指數函數 e^x | e(1) → 2.71828 |
j(n,x) | 貝塞爾函數 | 進階數學運算 |
變數與程式化控制
y) print "x greater\n"
# 迴圈
for (i=1; i<=5; i++) i^2
1
4
9
16
25
# 定義函數
define factorial(n) {
if (n <= 1) return 1
return n * factorial(n-1)
}
factorial(5)
120
邏輯與比較運算
4
0
3 > 2
1
# 邏輯運算
(3 > 2) && (1 < 2)
1
(3 > 2) || (1 > 2)
1
!(3 > 2)
0
管道模式:腳本整合首選
單行運算
多行運算(分號分隔)
Here Document 多行輸入
實戰應用範例
1. 磁盤使用率計算
2. 浮點數比較(bash 原生不支援)
$VER2" | bc -l) )); then
echo "版本 $VER1 較新"
fi
3. 科學計算腳本
常見問題與技巧
| 問題 | 解決 |
| 除法結果為 0 | 未設定 scale,預設整數除法 |
| 語法錯誤:illegal character | 輸入含中文標點或全形字符,請用半形 |
| 變數不保留 | 互動模式下變數僅在當前 session 有效 |
| 需要高精度 π | a(1)*4 利用反正切計算 π |
| 腳本中 bc 卡住 | 未提供輸入結束,使用 echo ... | bc 或 Here Doc |
替代工具對比
| 工具 | 優點 | 缺點 | 適用場景 |
| bc | 任意精度、標準內建、支援函數/流程控制 | 語法較舊、無矩陣運算 | 系統管理腳本、管道運算、精度要求高 |
| awk | 文本處理順便運算、內建數學函數 | 精度有限(雙精度浮點) | 日誌分析、CSV 計算 |
| python -c | 語法現代、豐富庫、任意精度 | 啟動較慢、非極簡系統必裝 | 複雜科學計算、JSON 處理 |
| dc | 逆波蘭表示法、極簡 | 難讀、難寫 | 嵌入式極簡環境 |
總結
bc 是 Linux 終端機計算的瑞士刀。掌握 scale 精度控制、ibase/obase 進位轉換、-l 數學庫與管道模式,即可覆蓋 95% 的運維計算需求。腳本整合時優先使用 echo "expr" | bc 模式,複雜邏輯改用 Here Document 或 Python。記住:浮點數比較、精度計算、進位轉換——bc 一把搞定。