シェルスクリプトの制御構造(while, foreach)

while

シェルでもC言語のようなwhile文が使用できる。
シェルで使用するwhile文の形式は次の通り。

while(条件)
    コマンド
end

C言語の { と } は無くて、そのかわり end が最期につく。
条件は if で紹介した条件と同じである。

whileの使用例

コマンドラインから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に変っている
#

次にMAYAでレンダリングされた画像ファイル名を変換するシェルスクリプトを作ってみよう。
viで以下のシェルスクリプトをrename.shという名前を作る。

set i = 1
while($i <= $argv[1])
	mv $argv[2].$i.iff $argv[3].$i.iff
	@ i ++
end
上のシェルスクリプトを実行すると以下のようになる。

# ls
persp_test.1.iff persp_test.2.iff persp_test.3.iff rename.sh
# csh rename.sh 3 persp_test kadai
# ls
kadai.1.iff kadai.2.iff kadai.3.iff rename.sh
#

foreach

シェルではC言語には無い、foreach というループが使用できる。
特定の名前のファイルなどに対してコマンドを実行する場合などに便利である。
foreachではリストの中の要素を一つづつ変数に代入してコマンドを実行する。
リストの部分にはファイル名、変数(配列)やコマンドの結果(コマンド置換)などが使用できる。

foreach 変数 ( リスト )
    コマンド
end

foreachの使用例

下の例ではMAYAのデータファイルを別の名前でコピーしている。

# ls
kadai.ma test.ma tmp.ma
# foreach f (*.ma)    <- *.maというファイル名を順番に変数fに代入する
foreach?  cp $f $f.old    <- $fに入っているファイル名に.oldをつけてコピー
foreach?  end    <- foreach 終り
# ls
kadai.ma kadai.ma.old test.ma test.ma.old tmp.ma tmp.ma.old
#

上のforeachでは以下の様に処理が進む。

  1. foreach f (*.ma)foreach f (kadai.ma test.ma tmp.ma)と展開される。
  2. foreachによってset f = kadai.maが実行される。
  3. cp $f $f.oldによって cp kadai.ma kadai.ma.oldが実行される。
  4. foreachによってset f = test.maが実行される。
  5. cp $f $f.oldによって cp test.ma test.ma.oldが実行される。
  6. foreachによってset f = tmp.maが実行される。
  7. cp $f $f.oldによって cp tmp.ma tmp.ma.oldが実行される。

練習課題

まとめ

参考


Prev | Next
Home | Contents
abe@injapan.net