【Linux】 シェルで数値計算する方法

linuxで数値計算をしたいという場面が、たまにありますが、いろいろな方法があるようです。その方法についてまとめてみました。

1. どのツールをいつ使うべきか?

まず今回紹介する方法の比較表です。

手法精度手軽さ向いている用途
$(( ))整数のみ★★★軽いシェルスクリプト、簡単な四則演算
bc任意精度★★☆サーバー上での精度が必要な計算
calc超高精度★☆☆数学的な検証、分数計算
awk中精度★★☆
Python高精度1★☆☆複雑な数式、エンジニアリング計算
  1. pythonは高精度としていますが、基本は型が自動定義なので、ちゃんと計算したい場合はパッケージの導入などが必要で、簡易的に計算したいという場面には向きません。 ↩︎

2. 各々の方法の使い方と計算例

2.1 $(( ))

シェルの標準的な算術式展開(Arithmetic Expansion)機能です。

計算式は以下のように入力します。

echo $((3 + 1))
  • 注意点としては、整数限定なので、10 ÷ 3などを計算させようとすると結果が 3になります。
シェルの基本機能を用いて計算させてみた例

2.2 bc (Arbitrary Precision Calculator)

Linuxにおけるもっとも標準的な計算機言語コマンドです。
パイプで渡す、あるいは対話モードで利用します。

echo "scale=2; 10 / 3" | bc
  • 注意点: デフォルトの状態では小数点以下を切り捨ててしまいます。小数を扱うには scale 変数で精度を指定するか、数学ライブラリをロードする -l オプションを付ける必要があります。
  • (個人的感想:デフォルト動作がちょこっと不親切です。)
bcを利用して計算させてみた例

2.3 calc

任意精度の計算が可能な、より「電卓」に近いコマンドです。 分数や複素数の計算に強みを持ちます。

calc "1/3 + 1/2"
# 分数で応えるモード
calc "config('mode', 'fraction'); 1/3 + 1/4"

# 応答の"real"などのもとのモードの返答が邪魔なときは ;をもう一つつけると消せます。
  • 注意点: 多くのディストリビューションで標準搭載されていないため、apt install calc などで別途インストールが必要です。結果が分数で返ってくるなど、挙動が少し特殊な場合があります。
calcコマンドを用いて計算させてみた例

2.4 awk

テキスト処理に特化したコマンドですが、強力な演算機能を持っています。 以下のように BEGIN ブロックを使って計算します。

awk 'BEGIN {print 10 / 3}'
  • 注意点: 本来はファイル内のデータを処理するためのツールであるため、単純な計算をするだけでも BEGIN {print ...} という定型句を書く必要があり、入力の手間が少し多めです。
awkで計算させてみた例

2.5 Python ワンライナー

インタプリタ言語であるPythonを、コマンドラインから直接呼び出す方法です。 計算の自由度は随一です。

python3 -c "print(1.2 * 3.4)"
  • 注意点: 浮動小数点の計算は得意ですが、コマンド自体が長くなりがち.精度固定しようとすると、Pythonなのに型定義しないといけない。
  • Python環境がないと動かず、shellの変数として使いにくいです。
pythonでターミナル上で計算させてみた例

まとめ:ターミナル計算、どれを選ぶ?

ここまでいくつかの手法を見てきましたが、結論としては「用途に合わせて2種類ほどを使い分ける」のが現実的だと感じました。

  • 「ちょっとした整数計算」なら、標準の $(( )) で十分。
  • 「小数点以下の精度や数学関数」が必要なら、calcpython3 -c をサッと叩く。

これだけでも事足りますが、調査を進めるうちに「もう少しこうだったらいいのに」という欲求も見えてきました。

既存手法の「あと一歩」なポイント

  1. 構文が長くなりがち bcscale 指定や、awkBEGIN {print ...}、Python の import math; など、正確さを求めれば求めるほどタイピング量が増え、ミスも起きやすくなります。
  2. 過去の計算結果が迷子になる 「さっきの計算結果に 1.1 を掛けたい」と思ったとき、わざわざ数値をコピペするか、複雑なシェル変数を駆使して覚えさせておく必要があります。
  3. 「設定」という名の罠 今回 calc で遭遇した「分数で出したいのにモード設定で四捨五入される」といった挙動のように、ツールの仕様を熟知していないと意図しない結果を招く怖さがあります。

理想の「電卓」を求めて

「もっと直感的に、計算履歴を追いながら、モダンなUIでサクサク計算したい……」

そんなワガママを叶えるために、現在、RustRatatui を使って、ターミナル上で動くオリジナルの TUI(Terminal User Interface)電卓を構想しています。

バックエンドに Rust を選ぶことで数値の堅牢性を担保しつつ、TUI ならではの「履歴の再利用」や「視覚的なわかりやすさ」を両立できるのではないか?と考えています。

この自作ツール編については、開発がある程度形になったところで、また別記事としてお届けできればと思います。

ここまで読んでいただきありがとうございます。

では、次の記事で。 lumenHero