if 制御構造は次のように複数の書き方がある(動作は全て同じ)。
#! /bin/sh
my_file="some.file"
# if 1
if test -f $my_file
then
echo "$my_file Exists."
else
echo "Not Found ${my_file}."
fi
# if 2
if test -f $my_file; then
echo "$my_file Exists."
else
echo "Not Found ${my_file}."
fi
# if 3
if [ -f $my_file ]; then
echo "$my_file Exists."
else
echo "Not Found ${my_file}."
fi
丸暗記でもいいけど、意味を理解したほうがベター。
まず if
は直後にくる「コマンド」の返り値で真偽を判断する。
上の例で test -f $my_file
はコマンド呼び出し。
シェルスクリプトは行指向のインタプリタを使ってるから「改行」には「コマンドの入力を終了したよ」という行を改める以上の意味がある。 だから、コマンドが複数行にまたがるときは改行する前に「\」を入れる。
test -f $my_file
はこれでひとつのコマンドだから、もし if test -f $my_file then
と書いてしまうと
「then
」というキーワードも test
の引数であると見做されてしまう。
そういうわけで、if test -f $my_file; then
と書いて、コマンドと then
を ;
で区別してあげる必要がある。
次に if [ -f $my_file ]; then
、[ ... ]
が test
コマンドの糖衣構文(シンタックスシュガー)。
すると ;
が then
の前に必要。
[ ... ]
もコマンドだから。
シェルスクリプトでは、コマンドや引数同士は半角スペースで区切る。
付け加えておくと、[ ... ];
この最後のセミコロンは改行と等しく
ひとつのコマンド呼び出しの終了を表しているだけなので、]
と ;
の間にスペースは不要。
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界 単行本 – 2003/2/1 ブルース・ブリン (著), Bruce Blinn (著), 山下 哲典 (翻訳)