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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 43

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

НапримСр, Ссли ΠΌΡ‹ Π΄Π°Π΄ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ myprog left right 'and center'

ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° myprog запустит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ Π΄Π°Π»Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

argc: 4

argv: {"myprog", "left", "right", "and center"}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚-счётчик содСрТит имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π² массив argv ΠΎΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт argv[0]. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ прСдставляСт собой строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.

Π’Π°ΠΌ всС это Π·Π½Π°ΠΊΠΎΠΌΠΎ, Ссли Π²Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π° языкС Π‘ стандарта ISO/ANSI, АргумСнты Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Π² сцСнариях ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ: $0, $1 ΠΈ Ρ‚.Π΄. Π―Π·Ρ‹ΠΊ ISO/ANSI Π‘ заявляСт, Ρ‡Ρ‚ΠΎ функция main Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° int, спСцификация X/Open содСрТит явноС объявлСниС, Π΄Π°Π½Π½ΠΎΠ΅ Ρ€Π°Π½Π΅Π΅.

АргумСнты ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΡƒΠ΄ΠΎΠ±Π½Ρ‹ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π² прилоТСниях Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСсколькими Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. МногиС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для измСнСния собствСнного повСдСния ΠΈΠ»ΠΈ установки ΠΎΠΏΡ†ΠΈΠΉ. Π’Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π΄Π°Π΅Ρ‚Π΅ эти Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Ρ„Π»Π°Π³ΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…ΡΡ со Π·Π½Π°ΠΊΠ° "дСфис". НапримСр, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° sort ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ для измСнСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ порядка сортировки Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ:

$ sort -r Ρ„Π°ΠΉΠ»

ΠžΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΎ, ΠΈ согласованноС ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ станСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Π±Ρ‹Π» свой ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π΅. НапримСр, взглянитС Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ способом ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π»Π΅Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

$ tar cvfB /tmp/file.tar 1024

dd if=/dev/fd0 of=/trap/file.dd bs=18k

$ ps ax

$ gcc --help

$ ls -lstr

$ ls -l -s -t -r

ΠœΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π² Π²Π°ΡˆΠΈΡ… прилоТСниях всС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ с дСфиса ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ, состоящими ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹. ΠŸΡ€ΠΈ нСобходимости ΠΎΠΏΡ†ΠΈΠΈ, Π½Π΅ содСрТащиС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΌΠΎΠ³ΡƒΡ‚ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ вмСстС послС ΠΎΠ±Ρ‰Π΅Π³ΠΎ дСфиса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄Π²Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ls ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ нашим рСкомСндациям. Π—Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ любоС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ dd Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ нашС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ совсСм Π½Π΅ с дСфисов (if=/dev/fd0): Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ tar ΠΎΠΏΡ†ΠΈΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ΠΎΡ€Π²Π°Π½Ρ‹ ΠΎΡ‚ своих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ! ЦСлСсообразно Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠ°ΠΊ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ дСфис для ΠΈΡ… выдСлСния. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρƒ нас ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΎΠΏΡ†ΠΈΠΈ получСния ΠΏΠΎΠΌΠΎΡ‰ΠΈ: -h ΠΈ --help.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ нСдостаток Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ β€” созданиС ΠΎΠΏΡ†ΠΈΠΈ +x (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€) для выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ -Ρ…. Π’ Π³Π»Π°Π²Π΅ 2 ΠΌΡ‹ примСняли ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set -ΠΎ xtrace для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ отслСТивания дСйствий ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set +ΠΎ xtrace для Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этого Ρ€Π΅ΠΆΠΈΠΌΠ°.

Π’Ρ‹, вСроятно, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ порядок ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всСх этих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ достаточно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π±Π΅Π· нСобходимости освоСния Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΈΠ΄ΠΈΠΎΡΠΈΠ½ΠΊΡ€Π°Π·ΠΈΡŽ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ². Часто СдинствСнный Π²Ρ‹Ρ…ΠΎΠ΄ β€” ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ -h (ΠΎΡ‚ Π°Π½Π³Π». help) ΠΈΠ»ΠΈ страниц ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ справочного руководства (man), Ссли программист прСдоставил ΠΎΠ΄Π½Ρƒ ΠΈΠ· этих возмоТностСй. Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ Π² этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ функция getopt прСдоставляСт изящноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. А сСйчас, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 4.1 Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.1. АргумСнты ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° args.c, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰Π°Ρ собствСнныС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

#include <stdio.h>

#include <stdlib.h>


int main(int argc, char *argv[]) {

 int arg;

 for (arg = 0; arg < argc; arg++) {

  if (argv[arg][0] == '-')

printf("option: %s\n", argv[arg]+1);

  else

   printf("argument %d: %s\n", arg, argv[arg]);

 }

 exit(0);

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΎΠ½Π° просто Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ ΠΎΠΏΡ†ΠΈΠΈ. Π‘ΡƒΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строковый Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -f. ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ.

$ ./args -i -lr 'hi there' -f fred.c

argument 0: ./args

option: i

option: lr

argument 3: hi there option: f

argument 5: fred.с

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚-счСтчик argc для задания Ρ†ΠΈΠΊΠ»Π°, ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Она Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠΏΡ†ΠΈΠΈ поиском Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ дСфиса.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ссли ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ доступны ΠΎΠΏΡ†ΠΈΠΈ -l ΠΈ -r, Ρ‚ΠΎ упускаСм Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π³Ρ€ΡƒΠΏΠΏΠ° -lr, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ -l ΠΈ -r.

Π’ стандартС X/Open (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ адрСсу http://opengroup.org/) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ стандартноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки (Utility Syntax Guidelines, руководство ΠΏΠΎ синтаксису ΡƒΡ‚ΠΈΠ»ΠΈΡ‚) ΠΈ стандартный ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс для прСдставлСния ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° языкС Π‘: функция getopt.

getopt

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π°ΠΌ Π»Π΅Π³Ρ‡Π΅ Π±Ρ‹Π»ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π² этих руководствах, ОБ Linux ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ простоС Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ срСдство getopt, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ использованиС ΠΎΠΏΡ†ΠΈΠΉ со значСниями ΠΈ Π±Π΅Π· Π½ΠΈΡ….

#include <unistd.h>

int getopt(int argc, char *const argv[], const char *optstring);

extern char *optarg;

extern int optind, opterr, optopt;

Ѐункция getopt ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ argc ΠΈ argv Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΈ строку спСцификатора ΠΎΠΏΡ†ΠΈΠΉ, которая сообщаСт getopt, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ Π½ΠΈΡ… связанныС с Π½ΠΈΠΌΠΈ значСния. optstring β€” это просто список символов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прСдставляСт ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ. Если Π·Π° символом слСдуСт Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ ΠΎΠΏΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ ассоциированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ принято ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Команда getopt ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ bash выполняСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

НапримСр, для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ²:

getopt(argc, argv, "if:lr");

Π’ Π½Π΅ΠΌ ΡƒΡ‡Ρ‚Π΅Π½Ρ‹ простыС ΠΎΠΏΡ†ΠΈΠΈ -i, -l, -r ΠΈ -f, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ послСдуСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°. Π’Ρ‹Π·ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, Π½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ порядкС, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π’Ρ‹ смоТСтС ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΈΠ· упраТнСния 4.2.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ getopt, β€” символ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ†ΠΈΠΈ, хранящийся Π² массивС argv (Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ). Π’Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ getopt ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ для ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ получСния ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ. Ѐункция Π²Π΅Π΄Π΅Ρ‚ сСбя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

β–‘ Π•сли опция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π° Π½Π΅Π³ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ внСшняя пСрСмСнная optarg.

β–‘ Ѐункция getopt Π²Π΅Ρ€Π½Π΅Ρ‚ -1, ΠΊΠΎΠ³Π΄Π° Π½Π΅ останСтся ΠΎΠΏΡ†ΠΈΠΉ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ -- заставит getopt ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ ΠΎΠΏΡ†ΠΈΠΉ.

β–‘ Π€ΡƒΠ½ΠΊΡ†ΠΈΡ getopt Π²Π΅Ρ€Π½Π΅Ρ‚ ?, Ссли Π΅ΡΡ‚ΡŒ нСраспознанная опция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½Π° сохранит Π²ΠΎ внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ optopt.

β–‘ Если ΠΎΠΏΡ†ΠΈΠΈ трСбуСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠΏΡ†ΠΈΠΈ -f) ΠΈ Π½Π΅ Π·Π°Π΄Π°Π½Π° никакая Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°, getopt ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ?. Если ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ Π² строкС ΠΎΠΏΡ†ΠΈΠΉ, ΠΏΡ€ΠΈ отсутствии Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ функция getopt Π²Π΅Ρ€Π½Π΅Ρ‚ : вмСсто ?.

Π’ΠΎ внСшнСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ optind хранится Π½ΠΎΠΌΠ΅Ρ€ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Ѐункция getopt ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΠ½Π° ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΠ»Π°ΡΡŒ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π΅Π΄ΠΊΠΎ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² установкС этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Когда всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ с опциями ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹, пСрСмСнная optind ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π³Π΄Π΅ Π² ΠΊΠΎΠ½Ρ†Π΅ массива argv ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. 

НСкоторыС вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getopt прСкратят Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π΅ ΠΎΠΏΡ†ΠΈΠΈ, Π²Π΅Ρ€Π½ΡƒΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1 ΠΈ установив ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ optind. Π”Ρ€ΡƒΠ³ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Π² ОБ Linux, ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΈ, Π³Π΄Π΅ Π±Ρ‹ ΠΎΠ½ΠΈ Π½ΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΈΡΡŒ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС getopt фактичСски ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅Ρ‚ массив argv Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ ΠΎΠΏΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ собраны вмСстС, начиная с элСмСнта массива argv[optind]. Π’ случаС вСрсии GNU Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getopt Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ опрСдСляСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния POSIXLY_CORRECT. Если пСрСмСнная установлСна, getopt остановится Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ Π½Π΅ ΠΎΠΏΡ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ getopt выводят сообщСния ΠΎΠ± ошибкС для Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π² стандартС POSIX написано ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли пСрСмСнная opterr Π½Π΅ Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ, функция getopt Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС Π² stderr.