Bash で空の if ブロックを書くにはコロン「:」を使う

次のような Bash スクリプトを書いた。

#!/bin/bash

if [ 'a' == 'a' ]; then
  # 今は処理がないので空
else
  echo 'ELSE'
fi

if ブロックの中はコメントのみだ。'a' == 'a' は真なので、このコメント部分の行が実行され、echo 'ELSE' は実行されない。

このコードを実行すると、次のようなエラーが出る。

$ sh test.sh
test.sh: line 5: syntax error near unexpected token `else'
test.sh: line 5: `else'

コレは if ブロックの中のコメントがなく、完全な空行でも発生する。

何か処理が書かれていないといけないんだな、と思い、「セミコロン ; でも置いたろ!」の精神で次のように書いてみた。

#!/bin/bash

if [ 'a' == 'a' ]; then
  ;
else
  echo 'ELSE'
fi

そしたらやっぱりエラー。

$ sh test.sh
test.sh: line 4: syntax error near unexpected token `;'
test.sh: line 4: `  ;'

セミコロンでもダメみたい。

どうしたらいいのかと調べてみると、次の記事を見つけた。

It seems that you want to do a no-op if the file is open so you should add a :, which is a null command in bash:

とのことで、コロン : を使うと良いらしい。早速やってみる。

#!/bin/bash

if [ 'a' == 'a' ]; then
  :
else
  echo 'ELSE'
fi

echo 'FINISHED'

if ブロックの中はコロン : のみ。今度は分かりやすくするため、最後に echo 文を付けておいた。

実行すると、思ったとおりに動いた。

$ sh test.sh
FINISHED

何らかの理由で、このような「何もしないブロック」が必要になった時は、コロンを使う。覚えておこう。