書式
math [-sN] EXPRESSION

概要

math コマンドは
数値計算を行ないます。

実体は、
任意精度の計算言語
bc プログラムのラッパーです。

非標準の拡張や
パイプライン を使うことなく
コマンドラインから
数式を指定できるようになります。

math コマンドで
サポートされている文法についての
説明は bcプログラムのマニュアル(和訳@外部サイト)
を参照してください。

ただし、
気をつけてほしいのは、
bc の数式が評価される前に
パラメータ展開 が行われることです。

パラメータ展開は、
シェル変数コマンド置換
関係する計算を行うのにとても便利です。

その代わり、
括弧はクォートかエスケープ
される必要があります。

オプション

以下のオプションがあります。

-sN
小数点以下の有効桁数を N に設定する。
N は整数で、デフォルトは0。
bcscale 変数を設定しているだけ。
-sN の間にスペースを入れてはいけない。

終了ステータス

終了ステータスはこのようになります。

2
  • 不正なオプション
  • 数式が指定されなかったとき
3
  • 不正な数式
1
  • 数式の結果が0のとき(0.0などではない)
  • 比較演算のときに便利
0
  • それ以外

実行例

math コマンドは
「=echo= +パイプライン+ bc
を簡略化してくれます。

$ math 1+1
2
$ echo 1+1 | bc
2
$ math 10 / 6
1
$ math -s0 10.0 / 6.0
1
$ math -s3 10 / 6
1.666
$ math -s3 10/6
1.666
$ echo 'scale=3; 10/6' | bc
1.666
$ math '2^10'
1024
$ math 'a=1; b=2; a+b'
3
$ math 'sqrt(2)'
1
$ math -s7 'sqrt(2)'
1.4142135
$ math 'scale=7; sqrt(2)'
1.4142135

比較演算もできます。

比較演算が偽の場合は
結果が0になりますので、

bcの結果が0になるときに
math が終了ステータス1を返して
異常終了するのは
意味のあることです。

$ math '3>1'
1
$ math '3>10'
0

シグナルによって
殺されたプロセスの
終了ステータス

「シグナル番号+128」
です。

そこで、
シグナル番号を
math コマンドを使って得る例です。

  1. 「1秒後に sleep 7 プロセスをシグナル9で殺す」
    スクリプトを バックグラウンドジョブ で実行
  2. sleep 7 をフォアグラウンドで実行
  3. その終了ステータスを得る
$ fish -c 'sleep 1; pkill -9 -f "sleep 7"'&; sleep 7; echo $status
fish: Job 2, 'sleep 7' terminated by signal SIGKILL (Forced quit)
137
$ fish -c 'sleep 1; pkill -9 -f "sleep 7"'&; sleep 7; math $status-128
fish: Job 2, 'sleep 7' terminated by signal SIGKILL (Forced quit)
9
fish: 'fish -c 'sleep 1; pkill -9 -f "…' terminated by signal SIGKILL (Forced quit)

注意

剰余( x % y )は
浮動小数点数では
完全にサポートされていません。

bc コマンドは
エラー終了するかわりに、
意味のない値を返してしまいます。

オペランドが整数である場合は
問題ありません(10 % 4 など)。

それでも
間違った結果になることがあります。

剰余を使うときは、
-sN オプションで
0より大きい N
指定しないでください。

# ここまでは正しい
$ math '10.1%4.2'
1.7
$ math '101%42'
17
$ math '10%4'
2
$ math '10%4.0'
2.0
$ math '10.0%4'
2.0
$ math '10.0%4.0'
2.0

# 間違ってる!!!!!!!
$ math -s3 '10%4'
0

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。