Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 11

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки являСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 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.