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); }
この書き方はjavaやc言語で書いてるぶんにはすっきりして良いのだが、シェルスクリプトで再現すると、中括弧を無理やり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