スポンサーリンク

GETOPT(3) FreeBSD ライブラリ関数マニュアル GETOPT(3)

名称

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

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#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 を 1 に設定し、変数 optind を再初期化する必要があ ります。

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

診断

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

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

拡張

getopt() 関数の複数回呼び出しを可能にするため、 optreset 変数が追加されま した。これは IEEE Std 1003.2 (‘‘POSIX.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> から切り離すために IEEE Std 1003.2-1992 (‘‘POSIX.2’’) で変更されました。

関連する引数を持つことは 決して許されませんが、 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;

}

FreeBSD 10.0 April 27, 1995 FreeBSD 10.0

スポンサーリンク