bash if の ; は何者か?
環境
- bash 3.2.25
解決
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 で文法になっているみたい。