shで文字列の判定がうまくいかない part1

Linux
スポンサーリンク

はじめに

つい先日、shで文字列判定がうまくいかないときがありました。

今回は、そんなスクリプトを紹介します。
みなさん、どこが怪しいのか分かりますか?

問題のスクリプト

スクリプトを書いていて、どうも処理が期待通りにならずに、
コードを少しずつ狭めていき、原因を調査していたんです。

そしたら、下記のコードに問題があることが分かりました、

#!/bin/sh

readonly string="OK"

if [ ${string} = "OK" ]; then
	echo "OK"
fi

if [ ${string} = "NG" ]; then
	echo "NG"
fi

これを実行すると、

./test.sh
OK
NG

!?

なぜ、NGまで出るんだ・・・

調査

みんなに聞いてまわり、

  • 文字列の判定なら「=」ではなく「==」ではないか。
  • 変数名が間違っているのでは?
  • if文の書き方それであってるの?
  • 気合が足らない

といろいろアドバイスをもらったのですが、

結局、解決できず、もやもやしていました。

原因判明

いろいろいじってたら次のような現象がおきました。

#!/bin/sh

readonly string="OK"

if [ ${string} = "NG" ]; then
	echo "NG1"
fi

if [ ${string} = "NG" ]; then
	echo "NG2"
fi

これを実行すると、

./test.sh
NG1

うーん。

なぜか2回目のif文の判定はうまくいくようだ・・・

ん・・・

!?

「=」の前が全角スペースになっているではないか!?

原因は全角スペースの混入

いやー。そんなポカミスしてるとは思っていませんでした。

というか全角スペースが入っている時点でエラーが出ると思ったのですが、
出ないんですねー。(処理系に依存しますが)

今回、半角スペースの制御文字に色を付ける設定もしていなかったので、
全角スペースと半角スペースがエディタ上から見わけがつかずに
かなり混乱していました。

灯台下暗し

コメント

タイトルとURLをコピーしました