シェルでもC言語のようなwhile文が使用できる。
シェルで使用するwhile文の形式は次の通り。
while(条件)
コマンド
end
C言語の { と } は無くて、そのかわり end が最期につく。
条件は if で紹介した条件と同じである。
コマンドラインからwhileを色々と試してみる。
# ls test1.c test2.c test3.c <- 最初test*.cというファイルがある # set i = 1 # while($i <= 3) <- iが3になるまで繰り返す while? mv test$i.c kadai$i.c <- ファイル名を変える while? @ i ++ <- iに1加える while? end <- whileの終り # ls kadai1.c kadai2.c kadai3.c <- ファイル名がkadaiに変っている #
同じものをシェルスクリプトにしてみよう。
viで以下のシェルスクリプトをrename.shという名前を作る。
上のシェルスクリプトを実行すると以下のようになる。
set i = 1
while($i <= 3)
mv test$i.c kadai$i.c
@ i ++
end
# ls test1.c test2.c test3.c # vi rename.sh # csh rename.sh # ls rename.sh kadai1.c kadai2.c kadai3.c #
シェルではC言語には無い、foreach というループが使用できる。
特定の名前のファイルなどに対してコマンドを実行する場合などに便利である。
foreachではリストの中の要素を一つづつ変数に代入してコマンドを実行する。
リストの部分にはファイル名、変数(配列)やコマンドの結果(コマンド置換)などが使用できる。
foreach 変数 ( リスト )
コマンド
end
下の例ではC言語のプログラムを別の名前でコピーしている。
# ls kadai.c test.c tmp.c # foreach f (*.c) <- *.cというファイル名を順番に変数fに代入する foreach? cp $f $f.old <- $fに入っているファイル名に.oldをつけてコピー foreach? end <- foreach 終り # ls kadai.c kadai.c.old test.c test.c.old tmp.c tmp.c.old #
上のforeachでは以下の様に処理が進む。
# ls kadai.c test.c # vi cpold.sh # csh cpold.sh test.c # ls cpold.sh kadai.c test.c test.c.old1 # csh cpold.sh test.c # ls cpold.sh kadai.c test.c test.c.old1 test.c.old2 # csh cpold.sh *.c # ls cpold.sh kadai.c kadai.c.old1 test.c test.c.old1 test.c.old2 test.c.old3 #上のように実行できるようにするためには、以下の様なシェルスクリプト(cpold.sh)を作る。
foreach f ($argv)
set i = 1
while(1)
if(! -f $f.old$i) then
cp $f $f.old$i
break
endif
@ i ++
end
end