シェルでもC言語・MELのようなif, while, switchなどの制御構造が使用できる。
また、MELにおけるfor( in )のようなforeachもある。
以下のようにthen と endif がC言語・MELの { と } に対応する。
if(条件) then
コマンド
.
.
endif
if(条件) then
コマンド1
.
.
else
コマンド2
.
.
endif
if(条件1) then
コマンド1
.
.
else if(条件2) then
コマンド2
.
.
else
コマンドn
endif
if(条件) コマンド
% if($x > 3 && $y < 5) echo test ← $xが3以上、$yが5以下のときコマンドを実行
% if(! -f test.ma) echo not exist ← test.maが存在しないときコマンドを実行
% if(1) echo test ← 条件が1(0以外)ならば test ← コマンド(echo)が実行される % if(0) echo test ← 条件が0ならばコマンド(echo)は実行されない
まず、コマンドラインから if を色々と試してみる。
ここでは実行するコマンドの例として echo コマンドを使用しているが、もちろんこのコマンド以外のコマンドも使用できる。
% set x = 3 % if($x > 1) echo test ← 条件が成り立っているので test ← コマンド(echo test)が実行される % if($x + 2 > 1) echo test ← 条件に数式を使う(条件が成り立っている) test ← コマンド(echo test)が実行される % set y = 2.5 % if($y > 1.0) echo test ← 条件に実数が使われていると if: Badly formed number. ← エラーになる % set z = aaa % if($z == "aaa") echo test ← 文字列同士を比べる test % ls test1.ma test2.ma % set f = test1.ma % if(-f $f) echo $f exist ← test1.maが存在するかどうか調べてコマンドを実行 test1.ma exist ← コマンド(echo $f exist)が実行される % set files = ( `ls *.mb` ) % if($#files > 0) echo test ← *.mbファイルが1つ以上あれば echo コマンドを実行(ないので実行されない) % cat test1.ma | wc -l ← test1.maの行数を調べるコマンド 238 ← test1.maの行数は238 % if(`cat test1.ma | wc -l` > 200) echo test ← test1.maの行数が200以上であれば echo コマンドを実行 test ← コマンド(echo test)が実行される
次に、ifを使ってtest.maというデータファイルが存在していればMAYAでレンダリングするシェルスクリプトを作って実行してみよう。
レンダリングにはRenderコマンドを使用している。
set f = test.ma
if(-f $f) then
Render -rd . $f
endif
% ls render.sh test.ma % csh render.sh ....... ← test.maをレンダリング % ls render.sh test.1.iff test.2.iff test.3.iff test.ma % fcheck -n 1 3 1 test.@.iff ← アニメーションのチェック %
シェルでもC言語のようなwhile文が使用できる。
シェルで使用するwhile文の形式は次の通り。
while(条件)
コマンド
end
C言語・MELの { と } は無くて、そのかわり end が最期につく。
条件は if で紹介した条件と同じである。
MAYAでレンダリングされた画像ファイル名を変換するシェルスクリプトを作ってみよう。
vi で以下のシェルスクリプトを rename1.sh という名前を作る。
上のシェルスクリプトを実行すると以下のようになる。
set i = 1
while($i <= 3)
mv test.$i.iff kadai.$i.iff
@ i ++
end
% ls rename1.sh test.1.iff test.2.iff test.3.iff % csh rename1.sh % ls rename1.sh kadai.1.iff kadai.2.iff kadai.3.iff %
set i = 1
while($i <= 3)
mv test.$i.iff kadai.$i.iff
@ i ++
end
シェルではC言語には存在しない、foreach というループが使用できる。
MELでは似たものとして for( in ) がある。
特定の名前のファイルなどに対してコマンドを実行する場合などに便利である。
foreach ではリストの中の要素を一つづつ変数に代入してコマンドを実行する。
リストの部分にはファイル名、変数(配列)やコマンドの結果(コマンド置換)などが使用できる。
foreach 変数 ( リスト )
コマンド
end
下の例ではカレントディレクトリにあるJPEGフォーマットの画像ファイルをGIFフォーマットに変換している。 (フォーマット変換には convert コマンドを使用している。)
foreach f (*.jpg)
convert $f $f:r.gif
end
$f:r はファイル名からピリオド以下の部分を取り去ったものになる。
% set nn = /aaa/bbb.ccc % set n1 = $nn:h % echo $n1 /aaa
% set nn = /aaa/bbb.ccc % set n2 = $nn:e % echo $n2 ccc
% set nn = /aaa/bbb.ccc % set n3 = $nn:t % echo $n3 bbb.ccc
% ls convert.sh kadai.jpg test.jpg tmp.jpg % csh convert.sh % ls convert.sh kadai.gif kadai.jpg test.gif test.jpg tmp.gif tmp.jpg %上のforeachでは以下の様に処理が進む。
シェルのswitch文はC言語のswitchに似ているが、もう少し柔軟な使い方ができる。
シェルで使用するswitch文の形式は以下の通り。
switch(変数)
case 値1 :
コマンド1
breaksw
case 値2 :
コマンド2
breaksw
.
.
default :
コマンド
endsw
C言語の ように{ と } は無くて、そのかわり endsw が最期につく。
値1、値2...の部分には数値・文字列どちらでも使用できて、正規表現も使うことができる。
例えば、値1または値2の部分が *.c であればファイル名の最期の2文字が .c であるようなファイル(C言語プログラム)になり、*.m[ab] であると最期の3文字が .ma または .mb であるようなファイル名(MAYAデータファイル)になる。
実行される順番は以下の通り。
画像ファイルの表示とMAYAのレンダリングを一つのプログラムで実行できるシェルスクリプトを作ってみよう。
以下のシェルスクリプトをviによってdo1.shというファイル名前で作る。
上のシェルスクリプトを実行すると以下のようになる。
switch($argv[1])
case *.iff :
fcheck $argv[1]
breaksw
case *.ma :
Render $argv[1]
breaksw
endsw
(サンプルデータkadai.maをホームディレクトリの下のunix2にダウンロード。)
% csh do1.sh kadai.ma ... ← Render kadai.ma を実行 % csh do1.sh test.iff ... ← fcheck test.iff を実行 % csh do1.sh kadai.jpg % ← 何も実行しない