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 は次の要素含み得ます。 それは、個々の文字と、後にコロンが付いた文字です。 コロン付きの文字は、後にオプションの引数が続くことを意味します。 たとえば、オプション文字列 amp; x" はオプション "-x" を受け入れ、オプション文字列 amp; 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 を、受け入れられない オプションに出会った場合は ‘?amp;’ を返します。引数リストにあるオプションの解釈は、オプション ‘--’ (2 重のダッシュ) によって取り消すことができます。 このオプションによって、 getopt() は引数処理の終わりを伝え、-1 を返します。 すべてのオプションの処理が終わると (すなわち、最初の非オプション引数に出会うと) getopt() は -1 を返します。

診断

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

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

拡張

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 と互換であるはずです。

オプション文字として数字も使えます。 このため、オプションとして数字 ("amp;-amp;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.

Modern Unix impedes progress in computer science, wastes billions of dollars, and destroys the common sense of many who seriously use it.
— The Unix Haters' handbook