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
%

koie