2026年5月29日
2026年5月29日
Linux の bc コマンドで計算する方法|小数(scale)・-l・進数変換・シェルでの使い方
bc は、桁数の制限なく計算できるコマンドラインの計算機です。Bash の $(( )) は整数しか扱えませんが、bc なら小数の計算や大きな数の計算ができるので、シェルスクリプトで使用率や金額を計算するときに使われます。
この記事の実行結果は、Debian 12 の GNU bc 1.07.1 で確かめたものです(2026年11月時点)。
インストール
多くのディストリビューションに入っていますが、最小構成のサーバーやコンテナには入っていないことがあります。bc: command not found と出たら入れます。
# Debian / Ubuntu
sudo apt install bc
# AlmaLinux / Rocky Linux / Fedora
sudo dnf install bc
基本の使い方
式を標準入力から渡します。echo とパイプで渡すのが一般的で、Bash ならヒアストリング(<<<)でも書けます。
echo "2 + 3" | bc # 5
echo "-1 - 2" | bc # -3
echo "4 * 5" | bc # 20
echo "10 / 3" | bc # 3(小数点以下は切り捨て)
echo "10 % 3" | bc # 1(余り)
echo "2 ^ 10" | bc # 1024(べき乗。指数は整数のみ)
bc <<< "3 * 4" # 12
引数なしで bc を実行すると対話モードになり、1 行ずつ計算できます。終わるときは quit と入力するか、Ctrl+D を押します。
小数を扱う: scale
bc の割り算は、何も指定しないと小数点以下 0 桁になります。小数点以下の桁数は scale で指定します。
echo "scale=2; 10 / 3" | bc # 3.33
echo "scale=2; 20 / 3" | bc # 6.66(6.67 にはならない)
echo "scale=2; 2 / 3" | bc # .66(先頭の 0 が付かない)
echo "scale=4; 1.5 * 2" | bc # 3.0
注意する点が 3 つあります。
- 四捨五入ではなく切り捨てです。
20 / 3は6.66になります。 - 1 未満の数は先頭の
0が付きません(.66)。ほかのプログラムに渡すときに困る場合は、後述のprintfで整えます。 - 掛け算の結果の桁数は
scaleどおりにならないことがあります。掛け算は、元の数の小数点以下の桁数をもとに結果の桁数が決まるため、scale=4; 1.5 * 2は3.0になります。scaleの桁数がそのまま結果に表れるのは割り算です。
-l オプション: 数学ライブラリ
bc -l で起動すると、scale が 20 になり、数学関数が使えるようになります。
echo "10 / 3" | bc -l # 3.33333333333333333333
echo "sqrt(2)" | bc -l # 1.41421356237309504880(sqrt は -l なしでも使える)
echo "4 * a(1)" | bc -l # 円周率(a は逆正接)
| 関数 | 意味 |
|---|---|
s(x) |
正弦(x はラジアン) |
c(x) |
余弦(x はラジアン) |
a(x) |
逆正接(結果はラジアン) |
l(x) |
自然対数 |
e(x) |
指数関数(e の x 乗) |
sqrt(x) |
平方根 |
^ の指数は整数しか使えないので、2 ^ 0.5 のような計算は e(0.5 * l(2)) と書きます。
進数の変換: ibase と obase
obase は出力の進数、ibase は入力の進数です。
echo "obase=2; 10" | bc # 1010(10 進数 → 2 進数)
echo "obase=16; 255" | bc # FF(10 進数 → 16 進数)
echo "ibase=16; FF" | bc # 255(16 進数 → 10 進数。A〜F は大文字で書く)
両方を指定するときは、obase を先に書きます。ibase を先に変えると、その後の obase の値も新しい進数で読まれるためです。
echo "ibase=2; obase=10; 1010" | bc # 1010(obase の 10 が 2 進数の 10、つまり 2 と読まれる)
echo "obase=10; ibase=2; 1010" | bc # 10(意図どおり)
変数と関数
bc の中で変数に値を入れて使えます。シェルの変数を渡すときは、シェル側で展開してから bc に渡します。
echo "scale=2; x = 7 / 2; x * 2" | bc # 7.00
a=10
b=20
echo "$a + $b" | bc # 30
define で関数を定義できます。よく使う関数はファイルに書いておき、bc の引数にファイル名を渡すと、ファイルを読み込んだ後に標準入力の式を計算します。
echo 'define triple(x) { return (x * 3); }' > ~/triple.bc
echo "triple(5)" | bc ~/triple.bc # 15
四捨五入したい場合は、関数にしておくと便利です。
define round(x, n) {
auto s, r
s = scale
scale = n + 1
if (x >= 0) r = x + 5 / 10 ^ (n + 1) else r = x - 5 / 10 ^ (n + 1)
scale = n
r = r / 1
scale = s
return (r)
}
これを ~/round.bc に保存して使います。
echo "round(10 / 3, 2)" | bc -l ~/round.bc # 3.33
echo "round(2 / 3, 2)" | bc -l ~/round.bc # .67
echo "round(2.5, 0)" | bc -l ~/round.bc # 3
表示の桁をそろえるだけなら、シェルの printf でも四捨五入できます(ロケールによっては小数点がカンマになるので、必要なら LC_NUMERIC=C を付けます)。
printf '%.2f\n' "$(echo 'scale=4; 10 / 3' | bc)" # 3.33
LC_NUMERIC=C printf '%.2f\n' "$(echo 'scale=4; 2 / 3' | bc)" # 0.67
シェルスクリプトで使う
結果を変数に入れる
result=$(echo "scale=2; 1980 * 1.1" | bc)
echo "$result" # 2178.0
小数を比較する
Bash の [ ] や (( )) は小数を比較できません。bc の比較演算子は、成り立てば 1、成り立たなければ 0 を出すので、それを使います。
usage=87.5
if (( $(echo "$usage >= 80" | bc) )); then
echo "使用率が 80% 以上です"
fi
列の合計を出す
printf '1.5\n2.25\n3\n' | paste -sd+ - | bc # 6.75
エラーを検出する
bc は、0 で割ったときや式の書き間違いがあっても、終了ステータスが 0 のままです。エラーの内容は標準エラー出力に出るので、そちらを見て判断します。if ! output=$(... | bc) のように終了ステータスで判定しても、エラーは検出できません。
calc() {
local errfile result
errfile=$(mktemp)
result=$(echo "$1" | bc -l 2>"$errfile")
if [ -s "$errfile" ] || [ -z "$result" ]; then
echo "計算エラー: $1 ($(cat "$errfile"))" >&2
rm -f "$errfile"
return 1
fi
rm -f "$errfile"
echo "$result"
}
calc "10 / 4" # 2.50000000000000000000
calc "1 / 0" || echo "失敗を検知" # 計算エラー: 1 / 0 (Runtime error ...: Divide by zero)
長い数の折り返しを止める
GNU bc は、70 文字を超える結果を \ と改行で折り返します。ほかのコマンドに渡すときは、環境変数 BC_LINE_LENGTH=0 で折り返しを止めます。
echo "2 ^ 300" | BC_LINE_LENGTH=0 bc
まとめ
- 式は
echo "式" | bcで渡す。何も指定しないと割り算は整数(切り捨て) - 小数は
scaleで桁数を指定する。四捨五入ではなく切り捨てで、1 未満は先頭の 0 が付かない bc -lで scale が 20 になり、scaleの数学関数が使える- 進数変換は
obaseを先に、ibaseを後に書く - スクリプトでは比較結果の 1 / 0 を使い、エラーは終了ステータスではなく標準エラー出力で判定する