exprと$(())

bashシェルスクリプトを書く時の演算にはexprを使用していた。
だけどオライリーの『詳細シェルスクリプト』に"このコマンドはもう利用しない事を強くお勧めします"と記載がある。

という事で今後は$(())を使用する事に。

$ echo `expr 1 + 1`
2
$ echo $((1 + 1))
2

ただ$*1 と expr はどこが違う?]
上記のサイトでは「0で始まる数値を受け取ると、8進数リテラルと解釈してしまう」と記載されている。

実際に試してみる

$ echo $((09 + 1))
bash: 09: value too great for base (error token is "09")

たしかに。
意外と知らないでいるとハマるパターンだったかも。

ちなみにcshでは$(())は使用できなかった(HP-UXPOSIX Shellではいけた)

$ uname -s
HP-UX
$ echo $SHELL
/usr/bin/sh
$ ls -l /usr/bin/sh
-r-xr-xr-x   2 bin        bin         208896 Mar 16  2007 /usr/bin/sh
$ echo $((1 + 1))
2

% uname -s
SunOS
% echo $SHELL
/bin/csh
% ls -l /bin/csh
-r-xr-xr-x   2 root     bin       159196 12キ・19ニ・2003? /bin/csh*
% echo $((1 + 1))
文法があいまいです

*1:))を使用する時には0から始まる値だと8進数として扱われてしまうみたい。 [http://blog.cles.jp/item/4091:title=bash の $((