shargsの使い方

shargsは単体でも実行できるが、勿論、これだけでは何の意味もない。このshargsのスクリプトをメインとなるシェルスクリプトに組み込んで使うか、メインとなるシェルスクリプトから"source"コマンド(もしくは"."コマンド)で呼び出して使う。(shargsは150行を越えてしまったので、直接組み込むよりは、呼び出したほうが良いだろう。)例えば /usr/local/bin/shargsなどに保存しておいて呼び出す。sourceで呼び出して使う場合は次のようなパーミッションにしておく(呼び出して使う場合は"実行"許可は要らない。実行許可を与えなければ単体では実行できないので、余計なトラブルは少なくなると思う。

 % ls -l /usr/local/bin/shargs
 -rw-r--r-- 1 root root 5406 2008-07-20 16:18 /usr/local/bin/shargs

次にこのshargsを呼び出して使うメインとなるシェルスクリプトのサンプル、testargsを紹介する。

     1	#! /bin/sh
     2	
     3	ARGS_DEF_opt_char_flg="ab"
     4	ARGS_DEF_opt_char_val="cd"
     5	ARGS_DEF_opt_word_flg="help"
     6	ARGS_DEF_opt_word_val="config"
     7	ARGS_DEF_arg_namelist="out_file in_file ..."
     8	ARGS_DEF_arg_num_must=1
     9	
    10	. /usr/local/bin/shargs
    11	
    12	echo +++++
    13	set | grep ARGS_
    14	echo +++++
    15	
    16	if [ -n "$ARGS_fatal_error" ]; then echo $ARGS_message; exit 1; fi
    17	
    18	echo
    19	echo $ARGS_usage

3行目〜8行目は使用する引数のタイプ毎に名前を列挙しシェル変数に格納する。各シェル変数の意味は以下の通り:

シェル変数 意味
ARGS_DEF_opt_char_flg 文字型フラグオプションの集合 "aAbh"
ARGS_DEF_opt_char_val 文字型バリューオプションの集合 "io"
ARGS_DEF_opt_word_flg 単語型フラグオプションの集合 "help list"
ARGS_DEF_opt_word_val 単語型バリューオプションの集合 "config logfile"
ARGS_DEF_arg_namelist 出現順引数の単語の集合 "out_file in_file ..."
ARGS_DEF_arg_num_must 必須となる出現順引数の数 1

基本的にこの6つのシェル変数を定義すれば、大体の引数の処理は行なえる。(必要に応じて6つ全てを定義する必要もない。)
これらのシェル変数を定義しておいて shargsを sourceコマンド(上の例では"."コマンド)で呼び出している(10行目)。その後、shargsの動作確認のためにシェル変数を表示している(13行目)。実際にこのプログラムを実行すると次のようになる:

$ ./testargs -a --help -c / -d /dev --config .config output file-1 file-2 file-3
        1. +
ARGS_0=./testargs ←出現順引数 0はコマンド名 ARGS_1=output ←出現順引数 1の値は "output" ARGS_2=file-1 ←出現順引数 2の値は "file-1" ARGS_3=file-2 ←出現順引数 3の値は "file-2" ARGS_4=file-3 ←出現順引数 4の値は "file-3" ARGS__in_file=file-1 ←出現順引数 2の "in_file" の値は "file-1" ARGS__out_file=output ←出現順引数 1の"out_file" の値は "output" ARGS_count=4 ←読み込んだ出現順引数の数は4(output〜file-3) ARGS_error=N ←引数処理でエラーは無かったので "N"(No)となっている ARGS_opt_a=Y ←オプション文字型フラグの "a" は "Y"(Yes)となっている ARGS_opt_c=/ ←オプション文字型バリューの "c" の値は "/" となっている ARGS_opt_config=.config ←オプション単語型バリューの "config" の値は ".config" となっている ARGS_opt_d=/dev ←オプション文字型バリューの "d" の値は "/dev" となっている ARGS_opt_help=Y ←オプション単語型フラグの "help" は "Y"(Yes)となっている ARGS_usage='Usage: ./testargs [-ab] [--help] [-c argument] [-d argument] [--config argument] out_file [in_file ...]'
        1. +
Usage: ./testargs [-ab] [--help] [-c argument] [-d argument] [--config argument] out_file [in_file ...]

このようにshargsの処理でコマンドの引数を対応する名前のシェル変数に格納するので、あとは必要に応じてシェル変数を呼び出して使うだけである。

なお、shargsでは引数の"名前"に使えるのはアルファベットの小文字と大文字、数字、アンダーバー("_")だけに限定されてしまう。(引数の値にはこういった制限はない。)これは、引数の名前がそのままシェル変数として使われるため、シェル変数の名前に使用できる文字がに限定されてしまうからである。実用上は問題ないかと思う。もし、これ以外の文字を使って引数名の定義をすると、shargsの方でチェックして "ARGS_fatal_error" というシェル変数を定義するので、もし、この変数が定義されていればメッセージ(ARGS_message)を見て引数の名前を再確認する。

また、必須となる出現順引数の数(ARGS_DEF_arg_num_must)が出現順引数の名前リスト(ARGS_DEF_arg_namelist)の要素数よりも多い場合もFatalエラーとした。例えば、必須出現順引数の数が2の場合、名前リストには最低限2つの名前が列挙されていなければならない。"ARGS_fatal_error" というシェル変数が定義されるのでメッセージ(ARGS_message)を見て修正する。

一方、定義は問題ないが、シェルスクリプトの引数の与え方に問題があった場合(例えば、定義されていないオプション文字や名前を使った場合、必須引数に値が与えられなかった等の場合)には "ARGS_error" というシェル変数が定義される。このシェル変数が定義されていたら、Usageメッセージ(コマンドの使い方メッセージ、"ARGS_usage" に格納される)を出力するなどの処理を行なう必要がある。