shargsのサンプルと留意点
名前付き出現順引数のシェル変数は"_"が2つ
出現順引数の値は基本的にシェル変数 ARGS_1、ARGS_2と順番に格納されるが、対応する名前付き引数(ARGS_DEF_arg_namelist に定義されているもの)は"ARG__名前"というシェル変数にも格納されるが、その時アンダスコア"_"が2つであることに注意。これは他のシェル変数との競合を避けるために必要だった。
文字型バリューのオプションは混在可能
例えば、
command -a value_a -b value_b
は
command -ab value_a value_b
と入力しても処理出来る。また、文字型フラグとの混在も可能。例えば、
command -a value_a -b value_b -c -d
は
command -abcd value_a value_b
と入力してもOK。勿論順番が変わってもOK
command -dbca value_b value_a
但し、単語型バリューのオプションは一つ一つのオプションと値のペアーで記述する必要がある。つまり、
command --opt_x value_x --opt_y value_y
は次のようには書けない:
command --opt_x --opt_y value_x value_y : これはNG
出現順引数で数が未定のもの
例えばcatやlsのように引数として幾つでも渡せるコマンド作成する場合は、シェル変数 ARGS_DEF_arg_namelist の最後に" ..."を追加しておく。例えば:
ARGS_DEF_arg_namelist="file ..." ARGS_DEF_arg_num_must=0
とすれば出現順引数は無くても良いし、幾つあっても良い。読み込まれた値は ARGS_1 から順番に格納されていく。また、
ARGS_DEF_arg_namelist="file ..." ARGS_DEF_arg_num_must=1
では出現順引数は必ず1つは指定しなければならず、複数あっても良い。
ただし、ARGS_DEF_arg_namelistに" ..."の記述がなくても、出現順引数は全て読み込みエラーは発生しない。" ..."の記述はUsageメッセージの生成のためである。上の2番目のケース(ARGS_DEF_arg_num_must=1のケース)で生成されるUsageメッセージは
Usage: command file [...]
引数名の大文字と小文字は区別する
当たり前のようだが、変数名の大文字と小文字は区別する。例えば、次のような簡単な例で
#! /bin/sh ARGS_DEF_arg_namelist="InputFile inputfile" . /usr/local/bin/shargs echo +++ set | grep ARGS_ echo +++
これを実行すると、次のようになる。
$ ./testargs aaa bbbARGS_0=./testargs ARGS_1=aaa ARGS_2=bbb ARGS__InputFile=aaa ARGS__inputfile=bbb ARGS_count=2 ARGS_error=N ARGS_usage='Usage: ./testargs [InputFile] [inputfile]'
- +
- +
また、argsでは引数名に"-"等が使えないので "input-file"とう名前は使えないが、代わりに "InputFile"という名前を割り振ることができる。
「真」「偽」のシンボルを変更できる
シェル変数"ARGS_DEF_true"、ARGS_DEF_false"の設定により、真偽のシンボルを変えられる。デフォルトでは真は"Y"、偽は"N"にしてあるが、真を"t"、偽を"f"にしてもよいし、"1"、"0"でもよい。(その他何でも構わない。)定義した値に従ってフラグオプションの値にARGS_DEF_trueの値が代入される。
#! /bin/sh ARGS_DEF_true="1" ARGS_DEF_false="0" ARGS_DEF_opt_char_flg="abc" . /usr/local/bin/shargs echo +++ set | grep ARGS_ echo +++
という定義で実行すると以下の様な結果が得られる。
$ ./testargs -a -cARGS_0=./testargs ARGS_count=0 ARGS_error=0 ARGS_opt_a=1 ARGS_opt_c=1 ARGS_usage='Usage: ./testargs [-abc]'
- +
- +