3 wwwcheck1.csh の改良

まずは、2 節の 1., 2. にあるように、 [3] の wwwcheck1.csh を改良してみます。 ブラウザの立ち上げが不要なので、コマンドラインオプションは -q, -v, -h のみをサポートすることにします。 これらは同時に指定することはないので、 ひとつのオプションだけ考えるようにすればいいでしょう。
#! /bin/csh -f
#### 初期設定 ####
set workd = ~/wwwcheck     # 作業ディレクトリ
set urllistf = $workd/urllist     # URL リストファイル
set datad = $workd/data     # 取得したファイルの置き場所
set oldd = $workd/old     # 以前取得したファイルの置き場所
set wget = "wget -q -O -"     # wget のコマンドライン
set myverbose = 0     # 冗長出力をするかどうか

##### コマンドライン解析 ####
if ( $#argv > 0 ) then
    switch ( $argv[1] )
    case -v:
        set myverbose = 1
        breaksw
    case -q:
        set myverbose = 0
        breaksw
    case -h:
    default:
        echo "csh -f $0 ([option])"
        echo " [option]:"
        echo "     -v : 冗長出力"
        echo "     -q : 画面出力を抑制 (default)"
        echo "     -h : このメッセージ"
        exit
    endsw
endif

##### 実行部分 ####
mv $datad/*.html $oldd     # 前回取得したファイルを移動
set j=1
foreach url ( `grep "^#" $urllistf` )
    if ( $myverbose ) then
        echo "[$j] $url ==> $j.html"
    endif
    $wget "$url" > $datad/$j.html
    @ j ++
end

[3] の 7 節のスクリプトと比べると、 先頭に workd, oldd の変数が追加されていますが、 workd は、``~/wwwcheck'' が繰り返し使われるので それを置き換えたもので、 oldd は前に取得したファイルを保存するディレクトリです。

繰り返し現れる名前は、変数値にしておいてその変数を使用するようにしておくと、 それを変更する必要がある場合にその一箇所だけを変更すればよくなります。

コマンドラインオプションのチェックは foreach 文から if 文に変えて、 最初のオプション $argv[1] のみを調べるようにしてあり、 さらに -b, -nb のオプションを削除していますが、 最も大きな変更は実行部分の最初の行にある mv の行です。 mv はファイルの移動やファイル名の変更に使われる Unix 標準コマンドで、 以下のように使用します。

よって、このスクリプトの mv の行により、$datad にあった *.html (.html で終わる名前を持つすべてのファイル) が $oldd へ移動されることになります。

なお、[3] で説明したように、*.html は、 mv の実行前に実際のファイル名に展開されて実行されるので、実際には

mv $datad/1.html $datad/2.html $oldd
のようなものが実行されることになります (もちろん実際は $datad$oldd もその値に展開されてから 実行されます)。 ところがその展開の際に、 $datad 内にそのパターンにマッチするファイルが一つもない場合には、 そのファイル名パターンの展開に失敗し csh がエラーを出してしまいますので、 本当はそのようなファイルがあるかどうか チェックしてから実行するようにした方が安全なのですが、 とりあえずここではそのチェックは省略することにします1

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