[Linux] bash の if 文 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

bash の if 文はこんな風に記述します。

if [ -e test.sh ]; then
    chmod a+x test.sh
    . test.sh
else
    exit 1
fi

でも、この書き方、見慣れないうちはどうも違和感があります^^;


まず、"if"の直後の"[]"。

これはtest文という条件判定のためのコマンドの別の書き方(こちらの書き方のほうが一般的なようですが...)で、"[]"の中に条件式を書き、TRUE か FALSE を判定するようです。

ここでは"-e"というオプションを使ってファイルの存在チェックを行っています。


それから"[]"の後ろの";"。

これもまた不思議です。
";"は複数のコマンドを1行に連続して記述するときの区切り文字なのですが、何でこんなところにくっついているのでしょう?

”おまじない”とお茶を濁したいところですが、これは本来"then"を"if"の次の行に書かなければならないところを同じ行に書いているから、その区切りとして記述しなければならないということのようです。

つまり、本来の"if"文の書き方は

if 条件式then
"真"の場合に実行するコマンド
[else
"偽"の場合に実行するコマンド]
fi

なのです。

でも、他の言語では、大抵そう書かなければならないかどうかにかかわらず、"if"と同じ行に"then"を書くので、たとえ不可解な";"を付けなければならなくとも"if"と同じ行に"then"を書いたほうがすっきりするんですよね。


そして最後の"fi"。

"if"を逆にしたということなのでしょうが、これが一番違和感があります。
"case"文も"esac"で締めるのですが、なんかちょっとセンス悪いですよね^^


という具合に、なんだかとっても違和感のある if 文です。