shスクリプト(これは実行できない)
mode=0 if ($# > 0) then mode=1 endif if [ $mode -eq 0 ]; then i=0 while [ $i -lt 6 ] else for i in 6 7 8 9 10 endif do echo $i i=$((i + 1)) if [ $((i % 2)) -eq 0 ]; then done else echo "*" done endif echo "done"
cshスクリプト
set mode=0 if ($# > 0) then set mode=1 endif if ($mode == 0) then set i=0 while ($i < 6) else foreach i (6 7 8 9 10) endif echo $i @ i++ if ($i % 2 == 0) then end else echo "*" end endif echo "done"
cshだとループを実行時に変えられるしループの終わりも動的に変えられるってことのようだ。ブロックという考えがなくてループのおわりの end は単なる goto だと思えば、そういうものかという気もする。図示するとこんな感じになってブロックがネストしてない。
set mode=0 if ($# > 0) then set mode=1 endif _______ if block| if ($mode == 0) then | set i=0 ______________ | while ($i < 6) | while/foreach block | else ______| | foreach i (6 7 8 9 10) | |_______endif | echo $i | _______ @ i++ | if block| if ($i % 2 == 0) then | | end_________________________| | else | | echo "*" | | end_________________________| |_______endif echo "done"
実行例
% sh foreach.sh foreach.sh: 9: Syntax error: "else" unexpected (expecting "do") % sh foreach.sh xxx foreach.sh: 9: Syntax error: "else" unexpected (expecting "do") % csh foreach.csh 0 * 1 2 * 3 4 * 5 done % csh foreach.csh xxx 6 * 7 8 * 9 10 * done %