bash初見殺しシリーズ(勝手に命名)です。
exprは演算結果が0の時、リターンコードが1となります!?
$ num=`expr 3 -3`
$ echo $?
1
な、なぜ・・・?
どうやらexprコマンドは
式を計算するコマンドではなく、
式を評価するためのコマンド、と言うのが正しいらしいです。
分かりやすい例つきの解説:
http://qiita.com/h141gm/items/0bc678b3e152ab8138e9
式の結果が0の場合は(false扱いになるのか)リターンコード$?が1、
式の結果が0以外の場合は(true扱いになるのか)リターンコード$?が0に。
演算エラー(例えば 3 / 0 とか)ならリターンコード$?が2になります。
何も知らないと余計なエラーハンドリングする可能性があるので注意。
ぼくの同僚がこれで30分悩みました。
解決策→二重括弧
単に計算をしたいだけなら、bashなら、
**二重括弧$(( ))**するのが吉です。
これは単に「展開」するだけなので余計な式評価はしません。
outSum=$(( num1 + num2))
ちなみに、算術エラーの時はちゃんと拾ってくれます。
num=$(( 3 / 0 ))
とかやると、
エラー出力もでるし、リターンコード1が返ります。安心。
解説1:exprコマンドについて
http://itdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0248.HTM
やはり「評価する」のが主役割のご様子。
解説2:シェルで変数のインクリメントに expr を使うと100倍遅い件
http://qiita.com/d_nishiyama85/items/a117d59a663cfcdea5e4
速度的にも二重括弧$(( ))がいいようです。
蛇足:
exprは
expression
の略らしいです。「式」って意味です。
やっぱり式を評価する、というのがメイン役割っぽいですね。
演算ならcalcとかになってそうですし。