aboutsummaryrefslogtreecommitdiff
path: root/ja_JP.eucJP/man/man3/getopt.3
blob: 9a40815a0a5272137c9373ed816318a20540b47a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
.\" Copyright (c) 1988, 1991, 1993
.\"	The Regents of the University of California.  All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\"     @(#)getopt.3	8.5 (Berkeley) 4/27/95
.\"
.\" $FreeBSD$
.Dd April 27, 1995
.Dt GETOPT 3
.Os BSD 4.3
.Sh 名称
.Nm getopt
.Nd コマンドラインの引数リストからのオプション文字の取得
.Sh 書式
.Fd #include <unistd.h>
.Vt extern char *optarg;
.Vt extern int   optind;
.Vt extern int   optopt;
.Vt extern int   opterr;
.Vt extern int   optreset;
.Ft int
.Fn getopt "int argc" "char * const *argv" "const char *optstring"
.Sh 解説
.Fn getopt
関数はコマンドラインの引数リスト
.Fa argv
を逐次的に解析して、次の
.Em 既知
オプション文字を返します。受け入れオプション文字集合の文字列
.Fa optstring
に指定されていた場合、そのオプション文字は
.Em 既知
です。
.Pp
オプション文字列
.Fa optstring
は次の要素含み得ます。それは、個々の文字と、後にコロンが付いた文字です。
コロン付きの文字は後にオプションの引数が続くことを意味します。たとえば、
オプション文字列
.Li "\&""x""
はオプション
.Dq Fl x
を受け入れ、
オプション文字列
.Li "\&""x:""
はオプションと引数
.Dq Fl x argument
を受け入れます。後に続く引数の頭に余白があっても、
.Fn getopt
は構いません。
.Pp
.Fn getopt
からの戻ると、
.Va optarg
はそれが予期されていればオプションの引数を示し、変数
.Va optind
には以後の
.Fn getopt
呼び出しで使用する、次の
.Fa argv
引数のインデックスが含まれます。また変数
.Va optopt
は、
.Fn getopt
によって返された最後の
.Em 既知
オプション文字を保存します。
.Pp
変数
.Va opterr
および
.Va optind
はどちらも 1 に初期化されます。多かれ少なかれ
.Fa argv
エントリを飛び越すための
.Fn getopt
呼び出しの設定前ならば、
.Va optind
変数は別の値に設定できます。
.Pp
複数セットの引数の評価または、1 つの引数セットの複数回評価のために
.Fn getopt
を使用する場合、2 回目以降の
.Fn getopt
各追加呼び出し設定前に変数
.Va optreset
は 1 に設定し、変数
.Va optind
は再初期化する必要があります。
.Pp
.Fn getopt
関数は引数リストを使い果たした場合 \-1 を、受け入れられない
オプションに出会った場合は
.Ql ?
を返します。引数リストにあるオプションの解釈は、オプション
.Ql --
(2 重のダッシュ) によって取り消すことができます。
このオプションによって、
.Fn getopt
は引数処理の終わりを伝え、\-1 を返します。
すべてのオプションの処理が終わると
(すなわち、最初の非オプション引数に出会うと)
.Fn getopt
は \-1 を返します。
.Sh 診断
文字列
.Va optarg
にない文字に出会うか、またはオプション引数の欠落を検出すると、
.Fn getopt
関数はエラーメッセージを
.Em stderr
に書き出して
.Ql ?
を返します。
.Va opterr
を 0 に設定すると、これらのエラーメッセージは無効になります。
.Fa optstring
の頭に
.Ql \&:
を付ければ、オプション引数に
欠落があった場合、あらゆるエラーメッセージを抑制した上で
.Ql \&:
が返ります。
.Pp
オプション引数を
.Dq Li \-
で開始可能です。これは合理的ですが、反面で
可能なエラーチェック回数を減らすという不利があります。
.Sh 拡張
.Fn getopt
関数の複数回呼び出しを可能にするため、
.Va optreset
変数が追加されました。これは
.St -p1003.2
規格への拡張です。
.Sh 使用例
.Bd -literal -compact
extern char *optarg;
extern int optind;
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\en", optarg, strerror(errno));
			exit(1);
		}
		break;
	case '?':
	default:
		usage();
	}
argc -= optind;
argv += optind;
.Ed
.Sh 歴史
.Fn getopt
関数は
.Bx 4.3
で最初に取り入れられました。
.Sh バグ
.Fn getopt
関数はいったん、\-1 の代わりに
.Dv EOF
を返すように指定されました。これは、
.Fn getopt
を
.Aq Pa stdio.h
から切り離すことで、
.St -p1003.2-92
により変更されました。
.Pp
.Fa optstring
の文字として単一ダッシュ
.Dq Li -
も指定できますが、
関連する引数を持つことは
.Em 決して
許されません。このため、オプションフラグとして
.Dq Li -
が予期されるプログラムでも、
.Fn getopt
を使用可能です。しかし、これは間違いです。
現在のどのようなプログラム開発でもこれは使うべきではありません。
下位互換のため
.Em だけ
に存在します。
デフォルトで単一ダッシュは、
.Fn getopt
に \-1 を返させます。これは System V と互換であるはずです。
.Pp
オプション文字として数字も使えます。このため、オプションとして数字
.Pq Dq Li \&-\&3
が予期されるプログラムでも
.Fn getopt
を使用可能です。しかし、これは間違いです。
現在のどのようなプログラム開発でもこれは使うべきではありません。
下位互換のため
.Em だけ
に存在します。
次のコードフラグメントが、ほとんどの場合に動作します。
.Bd -literal -offset indent
int length;
char *p;

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 = atoi(++p);
		else
			length = atoi(argv[optind] + 1);
		break;
	}
.Ed