GETOPT(3) FreeBSD ライブラリ関数マニュアル GETOPT(3)
名称
getopt − コマンドラインの引数リストからのオプション文字の取得 |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <unistd.h> extern char *optarg; 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; |
歴史
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 |