普通ある整数の四則演算のためのコマンドとして、 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.171sawk を使うならこうだろうという書き方のつもりだけど、 例えば 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