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

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

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

Для использования

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]
, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π’ΠΎ всСх случаях ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ '
--
' Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ сканированиС ΠΎΠΏΡ†ΠΈΠΉ.