Unix のコマンドは、元々必要最小限の情報しか画面表示しない寡黙なものが多く、 このスクリプト wwwcheck1.csh もそのようになっているのですが、 コマンドラインオプションにより、途中経過を表示するようにしてみます。 これは、デバッグにも役立ちます。
具体的には、以下の 2 つを行わせるようにします。
これは、-b などとは独立なオプションですから、 今度はオプションは一つとは限りませんので、 オプションのチェックも リスト変数 argv の要素がある間行わなければいけません。 よって、この場合は 5 節のコマンドライン解析部分の switch 文全体を囲んでいる if 文を foreach 文にすればいいわけです:
set browserOn = 0$argv は、リスト変数 argv の要素すべてを スペース区切りで書き並べたものに対応しますので、 「( $argv )」で argv のリストを再現できます。
set myverbose = 0
foreach option ( $argv )
switch ( $option )
case -v:
set myverbose = 1
breaksw
case -q:
set myverbose = 0
breaksw
case -b:
...
endsw
end
これは、もう一つのループである while 文で書くこともできます。
set browserOn = 0
set myverbose = 0
while ( $#argv )
switch ( $argv[1] )
case -v:
set myverbose = 1
breaksw
case -q:
set myverbose = 0
breaksw
case -b:
...
endsw
shift
end
while 文は C 言語の while 文と同様で、 ( ) 内の条件が真 (0 以外) の間 end までのコマンド列が実行されます。 この場合、switch 文の endsw の次についているコマンド shift が必要で、 shift は、
( "-b" "-v" ) ($#argv = 2)だった場合、一度 shift を行うとこれが
( "-v" ) ($#argv = 1)と変わります。
よって上のソースは、 while 文の条件文である argv の要素の数 ($#argv) が 0 でない間、 最初の要素 $argv[1] を switch 文に与えていることになり、 これでもちゃんと argv の要素がひとつひとつチェックされることになります。
このコマンドラインオプションの解析部分が済んだ後で、 まず -v に対応する以下の処理を追加します:
if ( $myverbose ) then
echo "(browserOn,myverbose) = ($browserOn,$myverbose)"
endif
そして、wget での取得を実行する foreach 文の部分を 例えば以下のようにすればいいでしょう:
foreach url ( `grep "^#" $urllistf` )
if ( $myverbose ) then
echo "[$j] $url ==> $j.html"
endif
$wget "$url" > $datad/$j.html
@ j ++
end
この場合、-v を指定すると、
(browserOn,myverbose) = (0,1)のようなものが表示されることになります。
[1] http://www.niit.ac.jp/ ==> 1.html
[2] http://www.niit.ac.jp/ieehtml/iee/ ==> 2.html
...
竹野茂治@新潟工科大学