コマンドライン引数の解析(getopt)

コマンドラインから入力された引数を自前のプログラムで処理するのはわりとメンドウな処理だが、getopt()という便利な関数を使うとこのあたりを自動化できる。

getopt()のサンプル

getopt()の第3引数でオプションを定義する。オプション名は1文字で、":"が付与されると、その後の文字をパラメータとして認識する。

定義されていないオプション(例えば-x)を付与して実行すると、default句に入る。opt変数には"?"が常に代入される。

パラメータはoptargから取得可能で、それ以外の引数はoptind配列に代入されている。

#include <unistd.h>
int main(int argc, char*argv[]){
  int i, opt;
  bool unknown = false;
  while ((opt = getopt(argc, argv, "abc:")) != -1) {
    switch (opt) {
      case 'a':
        printf("-a\n");
        break;
      case 'b':
        printf("-b\n");
        break;
      case 'c':
        printf("-c\n");
        printf("opt arg = %s\n", optarg);
        break;
      default:
        // opt = 63('?')
        unknown = true;
        break;
    }
  }
  // other option
  for (i = optind; i < argc; i++) {
    printf("other arg = %s\n", argv[i]);
  }
  if( unknown ){
    printf("Usage: %s [-a] [-b] [-c parameter] arg1 ...\n", argv[0]);
  }
  return 0;
}

実際に引数を付与して実行してみる

オプションなし

> ./a.out 777
other arg = 777

パラメータオプションにパラメータを付与しない場合、エラーメッセージが自動的に出力される。(Usageは自分で出力している)

> ./a.out -c
./a.out: option requires an argument -- 'c'
Usage: ./a.out [-a] [-b] [-c parameter] arg1 ...

パラメータ指定のないオプションにパラメータを付与した場合

> ./a.out -a 777 -b 888 999
-a
-b
other arg = 777
other arg = 888
other arg = 999

引数を連結して指定した場合

> ./a.out -abc xxx 123
-a
-b
-c
opt arg = xxx
other arg = 123