«前の日記(2013-06-16) 最新 次の日記(2013-06-20)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2013-06-18 シェルスクリプトで小数の大小比較を行う

シェルスクリプトで小数の大小比較を行うには bc を使う

単に自分が知って便利だったものの覚え書き。

シェルスクリプトで整数の大小比較を行うには通常 /bin/[ (testコマンド) または同名のシェルの内部コマンドを使って、以下のようにすると思います。

$ [ 2 -gt 1 ] && echo "2 is greater than 1"

test コマンドでは小数の大小比較はできないのでどうするのかというと、数値計算コマンドの bc を使ったら要件を満たすことができそうです。bc に不等号での大小比較表現を与えてやると、その結果が1または0で標準入力に返ってきます。trueのときが1で、falseのときが0です。

$ bc
33.4 > 1
1

↓イコール付きの表現でもOKです。

$ bc
33.4 >= 33.4
1

↓bc は対話的に入力を処理するので、シェルスクリプトから使うときには表現を標準入力から与えてやります。

$ echo "9800 > 33.4" | bc
1

↓標準入力から表現を与える代わりに -e オプションで与えることもできます。

$ bc -e "9800 < 33.4"
0

これだけだと、引数で与えた表現を処理したあとに標準入力からの入力を待ってしまうので -e quit をつけてやれば1回処理を実行したあとにプロセスが終了します。

$ bc -e "9800 < 33.4" -e quit
0

最後に if 文と [ コマンドを合わせて使うには、bc コマンドの出力が1と等しいかどうかを比べてやればいいのでこんな感じ。上下好みな方で。あとは数字を変数に置き換えたり。

if [ "$(bc -e "9800 > 33.4" -e quit)" -eq 1 ]; then
        echo "9800 is greater than 33.4"
fi
if [ "$(echo "9800 > 33.4" | bc)" -eq 1 ]; then
        echo "9800 is greater than 33.4"
fi
本日のツッコミ(全5件) [ツッコミを入れる]
Σ Noppi (2013-06-18 20:13)

知っていると便利そうだけど、そもそも小数の比較をするケースが思いつかない…。

Σ meta (2013-06-19 12:39)

九州電力の電力使用率を tmux のステータスバーに出力する<br>https://gist.github.com/metalefty/5803006<br><br>とかいうケースで小数第一位まで出したかったので使いました。

Σ Noppi (2013-06-19 21:19)

なるほど。

Σ hetuka (2016-12-28 22:44)

さがしていたので助かります。あざっしたー!!

Σ HOgehOGe (2017-02-27 22:31)

助かりました。