- 書式
- math [-sN] EXPRESSION
概要
math
コマンドは
数値計算を行ないます。
実体は、
任意精度の計算言語
bc
プログラムのラッパーです。
非標準の拡張や
パイプライン を使うことなく
コマンドラインから
数式を指定できるようになります。
math
コマンドで
サポートされている文法についての
説明は bcプログラムのマニュアル(和訳@外部サイト)
を参照してください。
ただし、
気をつけてほしいのは、
bc
の数式が評価される前に
パラメータ展開 が行われることです。
パラメータ展開は、
シェル変数 や コマンド置換 が
関係する計算を行うのにとても便利です。
その代わり、
括弧はクォートかエスケープ
される必要があります。
オプション
以下のオプションがあります。
-sN
- 小数点以下の有効桁数を
N
に設定する。
N
は整数で、デフォルトは0。
bc
のscale
変数を設定しているだけ。
-s
とN
の間にスペースを入れてはいけない。
終了ステータス
終了ステータスはこのようになります。
- 2
-
- 不正なオプション
- 数式が指定されなかったとき
- 不正なオプション
- 3
-
- 不正な数式
- 不正な数式
- 1
-
- 数式の結果が0のとき(0.0などではない)
- 比較演算のときに便利
- 数式の結果が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秒後に
sleep 7
プロセスをシグナル9で殺す」
スクリプトを バックグラウンドジョブ で実行 sleep 7
をフォアグラウンドで実行- その終了ステータスを得る
$ 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
最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。