foldrr's weblog

旧ブログ http://d.hatena.ne.jp/foldrr/

bash if の ; は何者か?

環境

問題

bash スクリプトの if で使う ; は何者か?
使わないといけないのか?

解決

if 〜 then を 1 行で書くために使っている。
セミコロンを使うと 2 行を 1 行にまとめることができる。
セミコロンの意味を理解するために例を考える。
例えば以下の 2 つは同じ意味になる。

echo 1
echo 2
echo 1; echo 2

但し、以下のように書くと違う結果になってしまう。

echo 1 echo 2  # => "1 echo 2"

if の別の書き方

セミコロンを使わない場合、then は次行に記述する。
以下の 2 つは同じ意味になる。

if [ 1 == 1]; then
  echo 1;
fi
if [ 1 == 1]
then
  echo 1;
fi

前述の箇所と重複するけど、if 〜 then は 1 行で記述したいこともある。
なら if と then の行をまとめればいい。
ということで 2 行を 1 行にまとめるため ; を使っている。

then は何を見ているのか?

if と then は切り離せることが分かった。
(というか元々別々のものを ; で繋いでいるだけだと分かった)
切り離しても動作する then は何を見て条件判断しているのだろう?
もしかしたら終了コードを見ているのかもしれない。
まず以下のコードを書いてみた。
条件が成立しないので 2 を表示する。

if test 1 == 0
then
  echo 1
else
  echo 2
fi

次に以下のコードを書いてみた。
if と then の間に別のコードが入っている。
すると hello と 1 を表示する。

if test 1 == 0
echo hello
then
  echo 1
else
  echo 2
fi

then は if の条件ではなく echo の終了コードを判定する。
echo が終了コード 0 を返したため、1 を表示する。
やはり then は終了コードをみているみたい。

if の無い then はありえるのか?

then が終了コードを見るだけのだとしたら if を書かずともエラーにならないかも、と考えた。
そこで以下のコードを書いてみた。

echo "hello"
then
    echo 1
else
    echo 2
fi

実行するとエラーになった。

$ ./sample
hello
./sample: line 3: syntax error near unexpected token `then'
./sample: line 3: `then'

if は単なる飾りではなく、if 〜 then で文法になっているみたい。