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 bbb
    1. +
ARGS_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]'
    1. +

また、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 -c
    1. +
ARGS_0=./testargs ARGS_count=0 ARGS_error=0 ARGS_opt_a=1 ARGS_opt_c=1 ARGS_usage='Usage: ./testargs [-abc]'
    1. +