5 コマンドラインオプションのサポート

4 節の最後で、 取得したものを見るためにブラウザを立ち上げるような改良を考えましたが、 取得した直後にはブラウザを立ち上げたいとは思わないかもしれませんし、 既にブラウザが立ち上がっている場合は、 二重にブラウザを立ち上げないようにしている場合もあるでしょう1

よって、そのブラウザの立ち上げを、 スクリプトの実行時にコマンドラインオプションを与えることで 切り替えられるようにすることを考えてみます。 まずは、とりあえず以下のようなオプションをサポートしてみることにします:

% csh -f wwwcheck1.csh -b : ブラウザを立ち上げる
% csh -f wwwcheck1.csh -nb : ブラウザを立ち上げない
% csh -f wwwcheck1.csh -h : オプションの説明のヘルプの表示のみ
% csh -f wwwcheck1.csh : ブラウザは立ち上げない (default)
このために変数 browserOn を設定し、 これが 1 のときはブラウザを立ち上げ、 0 のときはブラウザを立ち上げないようにします。 よってスクリプトの最初で、
set browserOn = 0 # 0 がデフォルト
とし、最後のところは
if ( $browserOn ) then
    $browser $datad/*.html
endif
のように if 文で条件分岐すればいいでしょう。 この if 文は、( ) 内の条件式が真 (0 以外) のときに endif までの部分が実行されます。

コマンドラインオプションの取得は、 特別なリスト変数 argv を参照することでできます。 オプションを調べるのには switch 文を利用します:

if ( $#argv > 0 ) then
    switch ( $argv[1] )
    case -b:
        set browserOn = 1
        breaksw
    case -nb:
        set browserOn = 0
        breaksw
    case -h:
    default:
        echo "csh -f $0 ([option])"
        echo " [option]:"
        echo "     -b : ブラウザを立ち上げる"
        echo "     -nb: ブラウザを立ち上げない (default)"
        echo "     -h : このメッセージ"
        exit
    endsw
endif

$#argv はリスト変数 argv の要素の個数を意味し、 コマンドラインオプションを指定しなければ 0、 指定すればその個数になり、 また $argv[1] はその最初のオプション文字列になります。

switch 文は C 言語の switch 文とほぼ同様ですが、 文字列ベースで比較されますので、 case ラベルには比較対象となる各文字列を置きます。 C 言語では break で各 case 処理を中断して抜けますが、 csh スクリプトの switch 文では breaksw で抜けます。 endsw は switch 文の終わりを意味します。

switch 文の代わりに if 文を使って、

if ( $argv[1] == "-b" ) then
    set browserOn = 1
else if ( $argv[1] == "-nb" ) then
    set browserOn = 0
else if ( $argv[1] == "-h" ) then
    ...
のようにしてもよさそうに見えるかもしれませんが、 csh スクリプトでは if などの構文の解析の前に変数置換が行われ、 よって最初の if 文が
if ( -b == -b ) then
のような行になってしまい、 if 文のカッコ内では数式評価が行われるため、 それが - から始まるとファイル検査式であると見なされて、 エラーになってしまいます (詳しくは [2] 参照)。これは、
if ( "X$argv[1]" == "X-b" ) then
のようにする、という対処もありますが、 数式評価を行わない switch 文を使用する方が無難だし、楽だと思います。

ところで、この switch 文では、オプションに従って 変数 browserOn の値を切り替えてセットしていますが、 オプションが ``-h'' の場合と、 いずれのオプションにもマッチしないものが指定された場合には (default: ラベル)、 ヘルプメッセージを表示して exit でスクリプトを強制終了するようにしています。

また、このヘルプ出力では、以下のものが使用されています。

これをさらに拡張して、立ち上げるブラウザの種類を オプションで切り替えたりすることもできるでしょう。 特に firefox では、既に firefox が立ち上がっている場合は それを操作して別ウィンドウのみを開くオプション -remote がありますので、firefox が立ち上がっているかどうかを調べて、 立ち上がっている場合にはそれを利用する、 といった改良も考えられるでしょう。

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