for文とかで使うセミコロンの位置

最近は、スクリプトが熱いですね。LLの基本はshにあると実感する今日この頃。そんな中、同僚がseqというコマンドを教えてくれた。

$ seq 10
1
2
3
4
5
6
7
8
9
10

数字を出力するだけのコマンド。最初なんのために使うんだと思ったけどもすぐにfor文で使うんだなと予測できた。
こんな感じ?

for i in `seq 10`
do
  echo $i
done

別の書き方。doの位置が行末にあるバージョン。

for i in `seq 10`; do
  echo $i
done

個人的にはこっちの方がすっきり見えて好きなんだけど、セミコロンの位置がわかりづらい。こんなのすぐ忘れるよって思った。

for i in `seq 10` do
  echo $i
done

これじゃダメなの?って思うよね。でも、今回for文の構文を見直してみたら、3つの文から構成されているとことに気づいて合点がいった。

1行目:for $var in $wordlist
2行目:do $command
3行目:done

3つの文(命令?)から構成されているから、続けて書く場合にはそれぞれにセミコロンが必要になる。
だから一行で書くと次のようになる。

$ for i in `seq 10`; do echo $i; done

このようにfor文は三つ文(コマンド?)で成り立っているのである。これでセミコロンの位置について記憶が曖昧になることはないだろう^^。

応用してwhile文を一行で書くとこうなる。

$ while :; do echo hoge;done

:はなにもしない命令。

ちなみに俺はdoは行末にあるのが好き。doを改行するスタイルは冗長に見えてしまう。

for i in `seq 10`
do
  echo $i
done
for (int i = 0; i < 9; i++)
{
  System.out.println(i);
}

この書き方はjavac言語で書いてるぶんにはすっきりして良いのだが、シェルスクリプトで再現すると、中括弧を無理やりdoとdoneで置き換えた感じで嫌。
やっぱりjavaでいく行末カッコの以下の書き方の方が好きだな。

for (int i = 0; i < 9; i++) {
  System.out.println(i);
}
for i in `seq 10`; do
  echo $i
done

ということでif文も次のようなスタイルです。

if [ -f hoge.txt ]; then
  echo 'exist!'
fi