ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° V7 echo, ΠΏΠ΅ΡΠ°ΡΠ°ΡΡΠ°Ρ ΡΠ²ΠΎΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄, ΡΠ°Π·Π΄Π΅Π»ΡΡ ΠΈΡ ΠΏΡΠΎΠ±Π΅Π»Π°ΠΌΠΈ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ -n, Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ. (ΠΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ.) ΠΠΎΡ ΠΊΠΎΠ΄[28]:
1 #include <stdio.h>
2
3 main(argc, argv) /*int main(int argc, char **argv)*/
4 int argc;
5 char *argv[];
6 {
7 register int i, nflg;
8
9 nflg = 0;
10 if (argc > 1 && argv[1][0] == && argv[1][1] == 'n') {
11 nflg++;
12 argc--;
13 argv++;
14 }
15 for (i=1; i<argc; i++) {
16 fputs(argv[i], stdout);
17 if (i < argc-1)
18 putchar(' ');
19 }
20 if (nflg == 0)
21 putchar('\n');
22 exit(0);
23 }
ΠΡΠ΅Π³ΠΎ 23 ΡΡΡΠΎΠΊΠΈ! ΠΠ΄Π΅ΡΡ Π΅ΡΡΡ Π΄Π²Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ argc ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ argv (ΡΡΡΠΎΠΊΠΈ 12 ΠΈ 13) ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΏΡΠΎΠΏΡΡΠΊΠ° Π½Π°ΡΠ°Π»ΡΠ½ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ -n (ΡΡΡΠΎΠΊΠ° 10) ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ. -no-newline-at-the-end ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. (ΠΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΡΠΎ!)
Π ΡΡΠ½ΠΎΠΉ ΡΠ°Π·Π±ΠΎΡ ΠΎΠΏΡΠΈΠΉ ΠΎΠ±ΡΡΠ΅Π½ Π΄Π»Ρ ΠΊΠΎΠ΄Π° V7, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΡ getopt() Π½Π΅ Π±ΡΠ»Π° Π΅ΡΠ΅ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π½Π°.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π·Π΄Π΅ΡΡ ΠΈ Π² Π΄ΡΡΠ³ΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΠΊΠ½ΠΈΠ³Π΅, ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° register. ΠΠ΄Π½ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ Π΄Π°Π²Π°Π»ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΡ, ΡΡΠΎ Π΄Π°Π½Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΡΡΡΠ°ΡΠ΅Π»ΠΎ; ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π²ΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ°Ρ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ register. ΠΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΡΡΠΎ ΡΠ»ΠΎΠ²ΠΎ ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ Π΅ΡΡΡ, Π½ΠΎ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΎΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ.[29]
2.3. Π Π°Π·Π±ΠΎΡ ΠΎΠΏΡΠΈΠΉ: getopt() ΠΈ getopt_long()
ΠΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² 1980-Ρ Π³ΡΡΠΏΠΏΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Unix Π΄Π»Ρ System III Π² AT&T Π·Π°ΠΌΠ΅ΡΠΈΠ»Π°, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Unix ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π° Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ. Π§ΡΠΎΠ±Ρ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ², ΠΎΠ½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ°Π½Π΅Π΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠΉ. (Π₯ΠΎΡΡ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² System III ΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π»Ρ intro(1) Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΡΠ΅ΠΌ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ POSIX.)
ΠΡΡΠΏΠΏΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Unix ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ getopt(), Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ, ΡΡΠΎΠ±Ρ ΡΠΏΡΠΎΡΡΠΈΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅Π³ΠΎΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠΉ. Π€ΡΠ½ΠΊΡΠΈΡ GNU getopt_long() ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΡ Ρ getopt() Π²Π΅ΡΡΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠ°Π·Π±ΠΎΡ Π΄Π»ΠΈΠ½Π½ΡΡ ΠΎΠΏΡΠΈΠΉ Π² ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ ΡΠ°Π½Π΅Π΅ ΡΠΎΡΠΌΠ΅.
2.3.1. ΠΠΏΡΠΈΠΈ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ
Π€ΡΠ½ΠΊΡΠΈΡ getopt() ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
#include <unistd.h> /*POSIX*/
int getopt(int argc, char *const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ argc ΠΈ argv ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡ main(). optstring ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠΎΠΊΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΎΠΏΡΠΈΠΉ. ΠΡΠ»ΠΈ Π·Π° ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π±ΡΠΊΠ²ΠΎΠΉ Π² ΡΡΡΠΎΠΊΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΠ΅, ΡΡΠ° ΠΎΠΏΡΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ Π½Π°Π»ΠΈΡΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ getopt() Π²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅ Π΅Π΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ· ΡΠΈΠΊΠ»Π° while Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π½Π΅ Π²Π΅ΡΠ½Π΅Ρ -1. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΎΠΏΡΠΈΠΈ, ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ». ΠΡΠ»ΠΈ ΠΎΠΏΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ optarg. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΠΎΠΏΡΠΈΡ -Π° Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΈ ΠΎΠΏΡΠΈΡ -b Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ:
int ΠΎΡ; /* ΡΠΈΠΌΠ²ΠΎΠ» ΠΎΠΏΡΠΈΠΈ */
char *b_opt_arg;
while ((ΠΎΡ = getopt(argc, argv, "ab:")) != -1) {
switch (oc) {
case 'a':
/* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° -Π°, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ»Π°Π³ */
break;
case 'b':
/* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° -b, ΠΏΠΎΠ»ΡΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΈΠ· optarg */
b_opt_arg = optarg;
break;
case ':':
... /* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ, ΡΠΌ. ΡΠ΅ΠΊΡΡ */
case '?':
default:
... /* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ, ΡΠΌ. ΡΠ΅ΠΊΡΡ */
}
}
Π Ρ ΠΎΠ΄Π΅ ΡΠ°Π±ΠΎΡΡ getopt() ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠΈΠ±ΠΎΠΊ:
char *optarg
ΠΡΠ³ΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΈ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ.
int optind
Π’Π΅ΠΊΡΡΠΈΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ Π² argv. ΠΠΎΠ³Π΄Π° ΡΠΈΠΊΠ» loop Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Ρ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Ρ argv[optind] ΠΏΠΎ argv[argc-1]. (ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ 'argv [argc] ==NULL'.)
int opterr
ΠΠΎΠ³Π΄Π° ΡΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π½Π΅ ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ), getopt() ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠΏΡΠΈΠΉ ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΎΠΏΡΠΈΠΉ.
int optopt
ΠΠΎΠ³Π΄Π° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΎΠΏΡΠΈΠΈ, getopt() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π»ΠΈΠ±ΠΎ '?', Π»ΠΈΠ±ΠΎ ':' (ΡΠΌ Π½ΠΈΠΆΠ΅), a optopt ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΠΉ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ».
ΠΡΠ΄ΠΈ Π΅ΡΡΡ Π»ΡΠ΄ΠΈ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ Π±ΡΠ΄ΡΡ ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π»ΠΈΠ±ΠΎ Ρ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠΏΡΠΈΠ΅ΠΉ, Π»ΠΈΠ±ΠΎ Ρ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΎΠΏΡΠΈΠΈ. ΠΠ±ΡΡΠ½ΠΎ Π² ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ getopt() Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ» '?'. ΠΠ΄Π½Π°ΠΊΠΎ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π²ΡΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π·Π°ΠΏΠΈΡΠ°Π² 0 Π² opterr ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ getopt(), ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡΠ°Π²ΠΈΡΡ getopt() Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΏΡΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
ΠΠΎ-Π²ΡΠΎΡΡΡ , Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π² optstring ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΠ΅ΠΌ, getopt() Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ΠΠ΅Π²Π΅ΡΠ½Π°Ρ ΠΎΠΏΡΠΈΡ
getopt() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ '?', a optopt ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅Π²Π΅ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΎΠΏΡΠΈΠΈ (ΠΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅).
ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΎΠΏΡΠΈΠΈ
getopt() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ':'. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» optstring Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΠ΅ΠΌ, getopt() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ '?', Π΄Π΅Π»Π°Ρ ΡΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ Π½Π΅ΠΎΡΠ»ΠΈΡΠΈΠΌΡΠΌ ΠΎΡ ΡΠ»ΡΡΠ°Ρ Π½Π΅Π²Π΅ΡΠ½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° optstring Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΌΡΡΠ»ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ Β«Π½Π΅Π²Π΅ΡΠ½ΡΡ ΠΎΠΏΡΠΈΡΒ» ΠΈ Β«ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΎΠΏΡΠΈΠΈΒ». Π Π°ΡΠΏΠ»Π°ΡΠΎΠΉ Π·Π° ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ getopt() Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, Π·Π°ΡΡΠ°Π²Π»ΡΡ Π²Π°Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ . ΠΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΡΠΎΡ ΡΠ°Π· Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΎΡΠΈΠ±ΠΎΠΊ:
int ΠΎΡ; /* ΡΠΈΠΌΠ²ΠΎΠ» ΠΎΠΏΡΠΈΠΈ */
char *b_opt_arg;
while ((ΠΎΡ = getopt(argc, argv, ":ab:")) != -1) {
switch (oc) {
case 'a':
/* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° -a, ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ»Π°Π³Π° */
break;
case 'b':
/* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° -b, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΈΠ· optarg */
b_opt_arg = optarg;
break;
case ':':
/* ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΎΠΏΡΠΈΠΈ */
fprintf(stderr, "%s: option '-%c' requires an argument\n",
argv[0], optopt);
break;
case '?':
default:
/* Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΎΠΏΡΠΈΡ */
fprintf(stderr, "%s: option '-%c' is invalid: ignored\n",
argv[0], optopt);
break;
}
}
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΎ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΡΠ»Π°Π³ΠΎΠ² ΠΈΠ»ΠΈ ΠΎΠΏΡΠΈΠΉ: Π² Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΠ΄Π° Π΄Π»Ρ Unix ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΈΠΌΠ΅Π½Π° Π² Π²ΠΈΠ΄Π΅ xflg Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΎΠΏΡΠΈΠΈ x (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, nflg Π² echo V7; ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ xflag). ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ Π΄Π»Ρ Π°Π²ΡΠΎΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π΅Π· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π·Π½Π°Π΅Ρ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΎΠΏΡΠΈΡ x. ΠΠΎ ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π΅ΡΠ΅, ΠΊΡΠΎ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΊΠΎΠ΄ ΠΈ Π½Π΅ Π·Π½Π°Π΅Ρ Π½Π°ΠΈΠ·ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΠ΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΎΠΏΡΠΈΠΉ. ΠΠΎΡΠ°Π·Π΄ΠΎ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π°, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠΈΠ΅ ΡΠΌΡΡΠ» ΠΎΠΏΡΠΈΠΈ, ΠΊΠ°ΠΊ no_newline Π΄Π»Ρ ΠΎΠΏΡΠΈΠΈ -n echo.
2.3.2. GNU getopt() ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΎΠΏΡΠΈΠΉ
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ getopt() ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠΈΡΠΊ ΠΎΠΏΡΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΡΡΠ΅ΡΠ°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ GNU getopt() ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ: ΠΎΠ½Π° ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΠΎΠΏΡΠΈΠΉ Π²ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ. ΠΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΎΠ½Π° ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ argv, ΡΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ Π΅Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ Π² Π½Π°ΡΠ°Π»ΠΎ, ΠΈ ΠΊΠΎΠ΄, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡΠΈΠΉ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Ρ argv[optind] Π΄ΠΎ argv[argc-1], ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΠΎ Π²ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ '--' Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΉ.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π² Π² optstring ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
optstring[0] == '+'
GNU getopt() Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ, ΠΊΠ°ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ getopt(); ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠΏΡΠΈΠΈ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΈΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ, ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅, Π½Π΅ ΡΠ²Π»ΡΡΡΠ΅ΠΌΡΡ ΠΎΠΏΡΠΈΠ΅ΠΉ. ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΡΡΠΎΠΊΠ° POSIXLY_CORRECT.
optstring[0] == '-'
GNU getopt() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ Π½Π΅Ρ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π»ΠΎΠ΅ 1, Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΡΡΠΎΠΊΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π² optarg.