普通ある整数の四則演算のためのコマンドとして、 expr
と bc
がある. expr
は整数しか扱えなくて、 bc
は浮動小数や任意精度も扱えるらしい.
他に、bashに組み込みのコマンドというか記法として $(( ))
と let
とがある.
普通 '*' という文字は、bashによって、 カレントディレクトリにあるファイル名全てを空白でつないだ文字列に展開されてから、 コマンドに引数として渡される. 従って、 expr
と bc
に渡すときにはちょっと面倒. 対して組み込みのコマンドの方は気にしなくていい.
知見として、 速度が全然違うので組み込みを使うべき.
それぞれの式で100回 \(10!\) を計算する:
gistを忘れてた.
% time ( for i in `seq 100`; do
seq 1 10 | awk -v prod=1 '{prod*=$1} END{print prod}' > /dev/null;
done )
real 0m0.126s
user 0m0.016s
sys 0m0.171s
awk
を使うならこうだろうという書き方のつもりだけど、 例えば expr
バージョンは一回の \(10!\) の計算に 10回 epxr
を呼び出してるのに、 これは awk
一回しか起動してないのでアンフェアな気がする.
bc
やり直し% time ( for i in `seq 100`; do
seq 1 10 | tr '\n' '*' | sed 's/\*$/\n/' | bc > /dev/null;
done)
real 0m0.122s
user 0m0.029s
sys 0m0.302s
はい速い. でも文字列加工は若干気持ち悪いし、回りくどい. これなら awk
でいい.
expr
やり直しこんなんしかできん
% time ( for i in `seq 100`; do
EXPR=`seq 1 10 | tr '\n' ' ' | sed 's/ *$//g' | sed 's/ / \\\\* /g'`;
bash -c "expr $EXPR";
done ) >/dev/null
real 0m0.318s
user 0m0.030s
sys 0m0.516s