EN JA
GETOPT(3)
GETOPT(3) FreeBSD Library Functions Manual GETOPT(3)

名称

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 を返します。

戻り値

getopt() 関数は、 optstring 中の次の既知のオプション文字を返します。 getopt() が optstring で見つけられなかった文字に遭遇するか、または欠けているオプション引数を検出するなら、‘ ?’ (疑問符) を返します。 optstring に先導する‘ :’があれば、欠けているオプション引数は、‘ ?’の代わりに返されるために‘ :’をもたらします。どちらの場合でも、変数 optopt は、エラーを引き起こした文字に設定されます。 getopt() 関数は、引数リストが使い果たされるとき、-1 を返します。

使用例

#include <unistd.h> 
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) { 
   (void)fprintf(stderr, 
       "myname: %s: %s\n", optarg, strerror(errno)); 
   exit(1); 
  } 
  break; 
 case '?': 
 default: 
  usage(); 
 } 
} 
argc -= optind; 
argv += optind;

診断

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

オプション引数を“ -”で開始することが許されています。これは、合理的ですが、可能なエラーチェックの量を減らします。

規格

getopt() 関数の複数回呼び出しを可能にするため、 optreset 変数が追加されました。これは、 IEEE Std 1003.2 (“POSIX.2”) 規格の拡張です。

歴史

getopt() 関数は、 4.3BSD で登場しました。

バグ

かつて getopt() 関数は、かつて-1 の代わりに EOF を返すように定められていました。この仕様は、 getopt() を < stdio.h> から切り離すために IEEE Std 1003.2-1992 (“POSIX.2”) で変更されました。

optstring の文字として単一ダッシュ“ -”も指定できます。しかしながら、関連する引数を持つことは、 決して できません。このため、オプションフラグとして“ -”を期待しているプログラムで、 getopt() を使用できます。この方法は、間違っています。現在のどのような開発でも、これを使うべきではありません。これは、下位互換のために だけ 提供されています。異なった意味を‘ -’で始まる optstring に割り当てる GNU getopt() との意味衝突を避けるために optstring での最初の文字として‘ -’を使用しないように注意するべきです。デフォルトでは、単一ダッシュは、 getopt() に-1 を返させます。

さらに、オプション文字として数字を扱うことも可能です。このため、オプションとして数字 (“ -3”) を期待しているプログラムで getopt() を使用できます。この方法は、間違っています。現在のどのような開発でも、これを使うべきではありません。これは、下位互換のために だけ 提供されています。次のコードの断片は、ほとんどの場合に動作します。

int ch; 
long 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 = ch - '0'; 
   ep = ""; 
  } else if (argv[optind] && argv[optind][1] == ch) { 
   length = strtol((p = argv[optind] + 1), 
       &ep, 10); 
   optind++; 
   optreset = 1; 
  } else 
   usage(); 
  if (*ep != '\0') 
   errx(EX_USAGE, "illegal number -- %s", p); 
  break; 
 }
April 27, 1995 FreeBSD