シェルスクリプトの引数処理をモジュール化

別にシェルスクリプトに限らないが、プログラムを作る時に引数の処理は大体、後回しになってしまう。そうするとプログラムを書いている途中では定数(や特定の値を代入した変数)を使ってハードコーディングしてしまって、後で直すのが なお更面倒になってしまう。そこで次のような組み込み用のシェルスクリプトを考えた。

  • オプションや引数の値をそれぞれ対応するシェル変数に取り込んでくれる
  • オプションや引数を出来る限りシンプルに定義でき、直ぐに変更できる
  • シェルスクリプト本体で行なう作業は最小限にできる(出来る限り自動化する)
  • 定義に従ってUsageメッセージも自動生成して、定義を変更してもプログラムを変更しなくて済む
  • 設定によっては色々と柔軟な付加機能を持つ
  • LinuxFedora 8)の標準機能だけで実現する

引数の処理をしてくれるライブラリとか関数とかモジュールとかがあれば良いのだけども、引数の処理はプログラム毎に違うのでライブラリ的に作るのはちょっと大変。と思っていたがシェルスクリプトに限定すればある程度汎用的に作れるのではと思って作って見た。(探せばあるのだろうが、シェルプログラミングの練習も兼ねて作成してみた。「追記(2008/04/05)」参照)

UNIXLinux)流の引数やオプションの定義にもとづいて、引数を次のように分類する:

  • 引数は"-"、"--"によって指定されるオプション(Option)と、出現の順番で指定されるもの(Ordered)がある
  • "-"が先頭にあるのは"文字型"のオプション
  • "--"が先頭にあるのは"単語型"のオプション
  • オプションは、値を持たないフラグ型と値を持つバリュー型がある
  • 出現順の引数は必ず必要なものと任意のものがある(必須引数の数を指定する)

これに基本ルールとして次の6項目を決めれば引数を(ある程度)自動的に処理できるシェルスクリプトが作れる。(カッコ内は下の例との対応)

  1. 文字型フラグオプションの文字の集合 ("ab")
  2. 文字型バリューオプションの文字の集合 ("cd")
  3. 単語型フラグオプションの単語の集合("help")
  4. 単語型バリューオプションの単語の集合("config")
  5. 出現順引数の単語の集合("out_file in_file ...")
  6. 必須となる出現順引数の数("1" out_fileだけが必須とする)
command [-ab] [--help] [-c argument] [-d argument] [--config argument] out_file [in_file ...]

これだけ定義すれば、引数を処理して次のようなシェル変数に変換する。

  • 文字型フラグオプションが指定されたら「ARGS_opt_X」(Xは対応する文字)を"Y"にする
  • 文字型バリューオプションが指定されたら「ARGS_opt_X」(Xは対応する文字)に値を代入する
  • 単語型フラグオプションが指定されたら「ARGS_opt_XXX」(XXXは対応する単語)を"Y"にする
  • 単語型バリューオプションが指定されたら「ARGS_opt_XXX」(XXXは対応する単語)に値を代入する
  • 出現順引数は出現順に「ARGS_1、ARGS_2 …」に値を代入する(ARGS_0はコマンド名とする)
  • 必須出現順引数は名前が定義されているので「ARGS__XXX」(XXXは対応する単語)にも値を代入する

あとはシェルスクリプトの本体の中で、"ARGS_..."という名前のシェル変数を参照すればいい。