2011年2月23日水曜日

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





0 件のコメント: