はじめに
つい先日、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文の判定はうまくいくようだ・・・
ん・・・
!?
「=」の前が全角スペースになっているではないか!?
原因は全角スペースの混入
いやー。そんなポカミスしてるとは思っていませんでした。
というか全角スペースが入っている時点でエラーが出ると思ったのですが、
出ないんですねー。(処理系に依存しますが)
今回、半角スペースの制御文字に色を付ける設定もしていなかったので、
全角スペースと半角スペースがエディタ上から見わけがつかずに
かなり混乱していました。
灯台下暗し
コメント