GETOPT(3)

名称
getopt - コマンドラインの引数リストからのオプション文字の取得

ライブラリ
libc

書式
#include <unistd.h> extern char *optarg; extern int optind; extern int optopt; extern int opterr; extern int optreset; int getopt(int argc, char * const *argv, const char *optstring)

解説
getopt() 関数は、コマンドラインの引数リスト argv を逐次的に解析して、次の 既知 オプション文字を返します。 受け入れオプション文字集合の文字列 optstring に指定されていた場合、そのオプション文字は 既知 です。

オプション文字列 optstring は次の要素含み得ます。 それは、個々の文字と、後にコロンが付いた文字です。 コロン付きの文字は、後にオプションの引数が続くことを意味します。 たとえば、オプション文字列 "x" はオプション “-x” を受け入れ、オプション文字列 "x:" はオプションと引数 “-x -argument” を受け入れます。 後に続く引数の頭に空白があっても、 getopt() は構いません。

getopt() から戻った時、 optarg は、それが予期されていればオプションの引数を示しており、変数 optind には、以後の getopt() 呼び出しで使用する次の argv 引数のインデックスが含まれます。 また変数 optopt は、 getopt() によって返された最後の 既知 オプション文字を保存してます。

変数 opterr および optind はどちらも 1 に初期化されます。 一連の getopt() 呼び出しの前ならば、いくつかの argv エントリを飛び越すために、 optind 変数を別の値に設定できます。

複数セットの引数の評価、または 1 つの引数セットの複数回評価のために getopt() を使用する場合、2 回目以降行われる追加の各一連の getopt() 呼び出し前に、変数 optreset を １ に設定し、変数 optind を再初期化する必要があります。

getopt() 関数は、引数リストを使い果たした場合 -1 を、受け入れられない オプションに出会った場合は ‘’? を返します。引数リストにあるオプションの解釈は、オプション ‘--’ (2 重のダッシュ) によって取り消すことができます。 このオプションによって、 getopt() は引数処理の終わりを伝え、-1 を返します。 すべてのオプションの処理が終わると (すなわち、最初の非オプション引数に出会うと) getopt() は -1 を返します。

診断
文字列 optstring にない文字に出会うか、またはオプション引数の欠落を検出すると、 getopt() 関数はエラーメッセージを stderr に書き出して ‘’? を返します。 opterr を 0 に設定すると、これらのエラーメッセージは無効になります。 optstring の頭に ‘’: を付ければ、オプション引数に 欠落があった場合、あらゆるエラーメッセージを抑制した上で ‘’: が返ります。

オプション引数を “-” で開始可能です。これは合理的ですが、反面で 可能なエラーチェック回数を減らすという不利があります。

拡張
getopt() 関数の複数回呼び出しを可能にするため、 optreset 変数が追加されました。これは p1003.2 規格への拡張です。

使用例
    int bflag, ch, fd;
    bflag = 0;
    while ((ch = getopt(argc, argv, "bf:")) != -1)
    	switch (ch) {
    	case 'b':
    		bflag = 1;
    		break;
    	case 'f':
    		if ((fd = open(optarg, O_RDONLY, 0)) < 0)
    			err(1, "%s", optarg);
    		break;
    	case '?':
    	default:
    		usage();
    	}
    argc -= optind;
    argv += optind;

歴史
getopt() 関数は 4.3BSD で初めて登場しました。

バグ
かつて getopt() 関数は、-1 の代わりに EOF を返すように定められていました。 この仕様は、 getopt() を <stdio.h> から切り離すために p1003.2-92 で変更されました。

関連する引数を持つことは 決して 許されませんが、 optstring の文字として単一ダッシュ “-” も指定できます。 このため、オプションフラグとして “-” を期待しているプログラムでも、 getopt() を使用可能です。 しかし、これは良い方法ではありません。 現在のどのようなプログラム開発でも、これを使うべきではありません。 下位互換のため だけ に存在します。 デフォルトで単一ダッシュは、 getopt() に -1 を返させます。 これは System V と互換であるはずです。

オプション文字として数字も使えます。 このため、オプションとして数字 (“-3”) を期待しているプログラムでも getopt() を使用可能です。 しかし、これは良い方法ではありません。 現在のどのようなプログラム開発でも、これを使うべきではありません。 下位互換のため だけ に存在します。 次のコードフラグメントが、ほとんどの場合 (でもすべてではない) に動作します。

    int length;
    char *p, *ep;
    while ((ch = getopt(argc, argv, "0123456789")) != -1)
    	switch (ch) {
    	case '0': case '1': case '2': case '3': case '4':
    	case '5': case '6': case '7': case '8': case '9':
    		p = argv[optind - 1];
    		if (p[0] == '-' && p[1] == ch && !p[2])
    			length = strtol(++p, &ep, 10);
    		else if (argv[optind] && argv[optind][1] == ch) {
    			length = strtol((p = argv[optind] + 1),
    			    &ep, 10);
    			optind++;
    			optreset = 1;
    		} else
    			usage();
    		if (*ep != ' ')
    			errx(EX_USAGE, "illegal number -- %s", p);
    		break;
    	}