窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

Shellのbracket [ ]をif-elifで使って記述ミスで学んだ話

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難しい