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-UXのPOSIX 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 の $((