zshで算術演算

今日のzsh
漢のzsh (8) これは既にシェルを超えている…… zshの算術演算 | マイナビニュース
算術計算をシェルで行うときに。

単純な整数の計算

exprを使う場合、'*'はエスケープしないといけないので注意が必要だけど

% expr 1 + 2 \* 3
7

この記法を使えばそんなのは気にしなくて大丈夫。

% echo $(( 1 + 2 * 3 ))
7


累乗の計算やビット演算はexprではできない?基本的に下の記法を使った方が良さそう。

% echo $(( 2 ** 10 ))
1024
% echo $(( 1 << 10 ))
1024

ここまではbashもできる。

小数の計算

ここからはbashではできない。

% echo $(( 2 ** 0.5 ))
1.4142135623730951
$ echo $(( 2 ** 0.5 ))
bash: 2 ** 0.5 : syntax error: invalid arithmetic operator (error token is ".5 ")

bashは小数を扱えないらしい。


とはいえ

% echo $(( 1.4 ))
1.3999999999999999

とか出力されるとちょっと残念だけど。

小数を扱う際の注意

変数に代入する場合、最初に代入されるものが整数か小数かで、その後に代入されるものがどう扱われるかが変わってしまう。

% (( i = 1 ))                     # 整数を代入
% echo $i
1
% (( i = 3.14 ))                  # 小数を代入
% echo $i
3                                 # 整数として扱われてしまっている
% 
% unset i                         # unsetする
% echo $i

% (( i = 3.14 ))                  # 最初に小数を代入
% echo $i
3.1400000000
% (( i = 1 ))                     # 整数を代入
% echo $i
1.0000000000                      # 小数として扱われる

for文に使うことも

巷で話題のCスタイルfor文も書ける。
これはbashでも書けるけど、やはり小数が使えるのがzshの強み。

% for (( i = 0.0; i < 1.0; i += 0.05 )); do echo $i; done
0.0000000000
0.0500000000
0.1000000000
0.1500000000
0.2000000000
0.2500000000
0.3000000000
0.3500000000
0.4000000000
0.4500000000
0.5000000000
0.5500000000
0.6000000000
0.6500000000
0.7000000000
0.7500000000
0.8000000000
0.8500000000
0.9000000000
0.9500000000

まぁMacだったらjotコマンドで良いんじゃね?ってなるけど。

% jot 20 0 0.95
0.00
0.05
0.10
0.15
0.20
0.25
0.30
0.35
0.40
0.45
0.50
0.55
0.60
0.65
0.70
0.75
0.80
0.85
0.90
0.95

数値処理をおこなう関数

mathfuncモジュールを読み込めばsinやcosのようなものも計算できるらしい。
まぁそこまでやるくらいだったら他の言語使うかなぁ。。

まとめ

簡単な計算をしたいときなんかには使えるかも。頼りすぎない程度に使ってみるといいかな?


最後に0.0以上1.0未満の数値を出力する乱数ワンライナーを。

echo $(($RANDOM./1<<15))

うん、perlで書いた方が短いね。

perl -le 'print rand'