総合手引 | セクション 3 | English | Deutsch | オプション |
#include <unistd.h>extern char *optarg;
オプション文字列
optstring
は次の要素含み得ます。
それは、個々の文字と、後にコロンが付いた文字です。
コロン付きの文字は、後にオプションの引数が続くことを意味します。
たとえば、オプション文字列
amp; x"
はオプション
"
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 を返します。
オプション引数を "-" で開始可能です。これは合理的ですが、反面で 可能なエラーチェック回数を減らすという不利があります。
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;
関連する引数を持つことは 決して 許されませんが、 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 |
総合手引 | セクション 3 | English | Deutsch | オプション |
このマニュアルページサービスについてのご意見は 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 |