bash: = とか -eq とか

きっかけ

先日、妙な動きをするスクリプトがあったので、修正した。

やはり、bash に慣れてない人から見ると下記の間違いは、気付きにくい

A=100

. . .なんらかの処理. . .

if [ $A=1 ]; then echo "same"; else echo "diff"; fi

実行結果は常に "same" と表示される。Aの値がなんであっても構わない。

理由はif文の中身で、$A と=と1がくっついているから。"$A=1"を値として評価しているため。

ただしくは、以下のように書く

if [ $A = 1 ]; then echo "same"; else echo "diff"; fi

=の前後にはスペースが必要

さてと、なんでこんなことになっているかというと、bashのif文は [ コマンドの戻り値を見ているから。

条件式は [ コマンドの引数なのだ。

$ A=0 

$ [ $A=1 ] ; echo $?

0

$ [ $A = 1 ] ; echo $?

1

※先頭の$はプロンプト

条件式が真のとき、戻り値は 0 、偽の場合は 1 になる。

数値は –eq 、文字列は =

話を戻すと、数値を比較するときは、下記のように、-eq を使う

if [ $A -eq 1 ]; then echo "same"; else echo "diff"; fi

$Aに数値が入っている場合、 = と同じ動作になる。

しかし、何らかの理由で、 $A の値が数値と解釈できない文字列だったりすると結果は違う。

$ A=ABC

$ if [ $A -eq 1 ]; then echo "same"; else echo "diff"; fi

-bash: [: ABC: 整数の式が予期されます

diff

$ if [ $A = 1 ]; then echo "same"; else echo "diff"; fi

diff

-eq を使えば、エラーが表示されるので、予期せぬ状況に対応しやすい。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック