tail head cat sleep
QR code linking to this page

manページ  — GETOPT

名称

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

内容

ライブラリ

Standard C Library (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() 関数は BSD 4.3 ではじめて登場しました。

バグ

かつて getopt() 関数は、-1 の代わりに EOF を返すように定められていました。 この仕様は、 getopt() <stdio.h> から切り離すために IEEE Std 1003.2-92 ("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;         }


GETOPT (3) April 27, 1995

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

Ken Thompson was once asked by a reporter what he would have changed about Unix if he had it all to do over again. His answer: “I would spell creat with an ‘e.'”