23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

exprは計算コマンドじゃなかった

Posted at

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とかになってそうですし。

23
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?