Shellを使うと割と頻出する
[ ここにいい感じの条件 ]
の test
コマンドと等価のこれ。
if-elif-elseの中の条件にこいつを使って、[]
の記述ミスで想定外の動作が起こりました。
元々のコード
TARGET= if [ "$TARGET" = "a" ]; then echo "a" elif [ "$TARGET" = "b"]; then echo "b" else echo "c" fi
ここのTARGETに"b"を入れていたのですが、"c"が表示されていました。
なぜ起こったか
elif [ "$TARGET" = "b"]; then
に問題があります。
[]
は[
の右にスペース1つ、]
の左にスペース1つが必要ですが、上記のコードでは]
のスペースが抜けています。
そのため条件としては正しいが、]
のスペースが抜けているためエラーを返してしまっていました。
# ~ $ [ 1 = 1] [: ']' expected # ~ $ echo $? 2 # ~ $ /bin/\[ 1 = 1] [: missing ] # ~ $ echo $? 2 # ~ $ [ 1 = 0 ] # ~ $ echo $? 1 # ~ $ [ 1 = 1 ] # ~ $ echo $? 0 # ~ $ [ 1 = 1]; [: ']' expected # ~ $ echo $? 2
0か0以外で判断なので、そうですねという感じでした。
防止策
頑張ってレビューする(違う
[ ]
ではなくて[[ ]]
を使うとどうなるでしょうか。
# ~ $ [[ 1 = 1]]; zsh: parse error near `;' # ~ $ echo $? 130
!!?
構文エラーはCtrl-C扱いになると。なるほどー
変に進まれるよりはいいので、ミスったら止まるに倒す場合は[[ ]]
を使うでもいいかもしれないと思いました。
いやーShell難しい