6 冗長出力

もうひとつの改良として、この節では冗長出力を考えてみます。

Unix のコマンドは、元々必要最小限の情報しか画面表示しない寡黙なものが多く、 このスクリプト wwwcheck1.csh もそのようになっているのですが、 コマンドラインオプションにより、途中経過を表示するようにしてみます。 これは、デバッグにも役立ちます。

具体的には、以下の 2 つを行わせるようにします。

そのために、この csh スクリプトに -v, -q というオプションを追加し、 -v を指定した場合に冗長出力、 -q とした場合は今まで通りとして、 それを変数 myverbose の値で切り替えることにします。 なお、``verbose'' という名前は、特別な意味を持ちますので (予約済み)、 変数名として使用することはできません。

これは、-b などとは独立なオプションですから、 今度はオプションは一つとは限りませんので、 オプションのチェックも リスト変数 argv の要素がある間行わなければいけません。 よって、この場合は 5 節のコマンドライン解析部分の switch 文全体を囲んでいる if 文を foreach 文にすればいいわけです:

set browserOn = 0
set myverbose = 0
foreach option ( $argv )
    switch ( $option )
    case -v:
        set myverbose = 1
        breaksw
    case -q:
        set myverbose = 0
        breaksw
    case -b:
        ...
    endsw
end
$argv は、リスト変数 argv の要素すべてを スペース区切りで書き並べたものに対応しますので、 「( $argv )」で argv のリストを再現できます。

これは、もう一つのループである 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 は、

ということを行います。 例えば argv が最初
( "-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
...
のようなものが表示されることになります。

竹野茂治@新潟工科大学
2008年1月22日