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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования Π½Π° языкС сцСнариСв ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈΒ»

Автор МСндСль ΠšΡƒΠΏΠ΅Ρ€

Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования Π½Π° языкС сцСнариСв ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ

Π”Π°Π½Π½ΠΎΠ΅ руководство Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρƒ читатСля ΠΏΠΎΠ·Π½Π°Π½ΠΈΠΉ Π² области программирования Π½Π° языкС сцСнариСв, ΠΎΠ΄Π½Π°ΠΊΠΎ, быстро восполняСт этот нСдостаток, постСпСнно, шаг Π·Π° шагом раскрывая ΠΌΡƒΠ΄Ρ€ΠΎΡΡ‚ΡŒ ΠΈ красоту UNIX. Π­Ρ‚ΠΎ руководство ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ изучСния ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ справочник ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½Π° shell. Руководство снабТСно сСриСй Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ языка сцСнариСв -- это написаниС сцСнариСв.


Advanced Bash-Scripting Guide

Автор: МСндСль ΠšΡƒΠΏΠ΅Ρ€ (Mendel Cooper [email protected])

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄: АндрСй КисСлСв < [email protected]>

ΠŸΠΎΡΠ²ΡΡ‰Π΅Π½ΠΈΡ

ΠŸΠΎΡΠ²ΡΡ‰Π°Π΅Ρ‚ΡΡ АнитС -- источнику очарования

Π§Π°ΡΡ‚ΡŒ 1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Shell -- это командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°. Но это Π½Π΅ просто ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ Π·Π²Π΅Π½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½ΠΎΠΉ систСмой, это Π΅Ρ‰Π΅ ΠΈ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ язык программирования. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС shell Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ сцСнариями, ΠΈΠ»ΠΈ скриптами. ЀактичСски, ΠΈΠ· скриптов доступСн ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄, ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ UNIX. Если этого нСдостаточно, Ρ‚ΠΎ ΠΊ вашим услугам Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ shell -- условныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ ΠΏΡ€., ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΌΠΎΡ‰ΡŒ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ сцСнариСв. Shell-скрипты ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ администрирования систСмы ΠΈ Π΄Ρ€., ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ для своСго создания полновСсных языков программирования.

Π“Π»Π°Π²Π° 1. Π—Π°Ρ‡Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Π½ΠΈΠ΅ языка Shell?

Π—Π½Π°Π½ΠΈΠ΅ языка ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ являСтся Π·Π°Π»ΠΎΠ³ΠΎΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ администрирования систСмы. Π”Π°ΠΆΠ΅ Ссли Π²Ρ‹ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ написаниСм своих сцСнариСв. Π’ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Linux выполняСтся Ρ†Π΅Π»Ρ‹ΠΉ ряд сцСнариСв ΠΈΠ· /etc/rc.d, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сСрвисы, поэтому ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ эти скрипты ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ достаточно Π·Π½Π°Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π½ΠΎΡΠΈΡ‚ΡŒ Π² Π½ΠΈΡ… ΠΊΠ°ΠΊΠΈΠ΅ Π»ΠΈΠ±ΠΎ измСнСния.

Π―Π·Ρ‹ΠΊ сцСнариСв Π»Π΅Π³ΠΎΠΊ Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ, Π² Π½Π΅ΠΌ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ спСцифичСских ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ конструкций. [ 1 ]Бинтаксис языка достаточно прост ΠΈ прямолинССн, ΠΎΠ½ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приходится Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ скрипты практичСски Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅, ΠΈ Π΄Π°ΠΆΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… скриптов ΠΎΡ‚Π½ΠΈΠΌΠ°Π΅Ρ‚ вСсьма Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя.

Shell-скрипты ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят для быстрого создания ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠ² слоТных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π΄Π°ΠΆΠ΅ Π½Π΅ смотря Π½Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ языковых конструкций ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ "ΠΌΠ΅Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ". Вакая ΠΌΠ΅Ρ‚ΠΎΠ΄Π° позволяСт Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ структуру Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ прилоТСния, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ "Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ" ΠΈ лишь Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½Π° C, C++, Java, ΠΈΠ»ΠΈ Perl.

Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ нас ΠΊ классичСской философии UNIX -- "раздСляй ΠΈ влавствуй" Ρ‚.Π΅. Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ слоТного ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° ряд простых ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡. МногиС ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΈΠ»ΠΈ, ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эстСтичным способом Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π½Π΅ΠΆΠ΅Π»ΠΈ использованиС Π½ΠΎΠ²ΠΎΠ³ΠΎ поколСния языков -- "всС-Π²-ΠΎΠ΄Π½ΠΎΠΌ", Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Perl.

Для ΠΊΠ°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡ Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ скрипты

для рСсурсоСмких Π·Π°Π΄Π°Ρ‡, особСнно ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ исполнСния (поиск, сортировка ΠΈ Ρ‚.ΠΏ.)

для Π·Π°Π΄Π°Ρ‡, связанных с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ матСматичСских вычислСний, особСнно это касаСтся вычислСний с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, вычислСний с ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, комплСксных чисСл (для Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ C++ ΠΈΠ»ΠΈ FORTRAN)

для кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ программирования (для этого Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ язык C)

для слоТных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° структурированиС являСтся ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ (ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ‚.ΠΏ.)

для Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ успСх прСдприятия.

ΠΊΠΎΠ³Π΄Π° Π²ΠΎ Π³Π»Π°Π²Ρƒ ΡƒΠ³Π»Π° поставлСна Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ систСмы, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ систСмы ΠΈ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ ΠΎΡ‚ вторТСния, Π²Π·Π»ΠΎΠΌΠ° ΠΈ Π²Π°Π½Π΄Π°Π»ΠΈΠ·ΠΌΠ°.

для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², содСрТащих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΎΡ‡Π΅Π½ΡŒ тСсно Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ собой.

для Π·Π°Π΄Π°Ρ‡, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ… ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ объСм Ρ€Π°Π±ΠΎΡ‚ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ

для Π·Π°Π΄Π°Ρ‡, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ массивами

ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со структурами Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ связанныС списки ΠΈΠ»ΠΈ Π΄Π΅Ρ€Π΅Π²ΡŒΡ

ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ графичСский интСрфСйс с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ (GUI)

ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ прямой доступ ΠΊ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°

ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡ€Ρ‚Ρ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ сокСты

ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

для ΠΏΡ€ΠΎΠΏΡ€ΠΈΠ΅Ρ‚Π°Ρ€Π½Ρ‹Ρ…, "Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ…" ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (скрипты ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ· сСбя исходныС тСксты ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, доступныС для всСобщСго обозрСния)


Если выполняСтся хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… условий, Ρ‚ΠΎ Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ скриптовым языкам программирования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Perl, Tcl, Python, Ruby ΠΈΠ»ΠΈ ΠΊ высокоуровнСвым ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ языкам -- C, C++ ΠΈΠ»ΠΈ Java. Но Π΄Π°ΠΆΠ΅ Π² этом случаС, созданиС ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° прилоТСния Π½Π° языкС shell ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

НазваниС BASH -- это Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΎΡ‚ "Bourne-Again Shell" ΠΈ ΠΈΠ³Ρ€Π° слов ΠΎΡ‚, ΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎ ΡƒΠΆΠ΅ классикой, "Bourne Shell" Π‘Ρ‚Π΅Ρ„Π΅Π½Π° Π‘ΡƒΡ€Π½Π° (Stephen Bourne). Π’ послСдниС Π³ΠΎΠ΄Ρ‹ BASH достиг Ρ‚Π°ΠΊΠΎΠΉ популярности, Ρ‡Ρ‚ΠΎ стал стандартной ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ de facto для ΠΌΠ½ΠΎΠ³ΠΈΡ… разновидностСй UNIX. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² программирования Π½Π° BASH ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Korn Shell (ksh), ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Bash позаимствовал Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнности[ 2 ], ΠΈ C Shell ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…. (ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ C Shell Π½Π΅ рСкомСндуСтся ΠΊ использованию ΠΈΠ·-Π·Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… Π’ΠΎΠΌΠΎΠΌ ΠšΡ€ΠΈΡΡ‚ΠΈΠ°Π½ΡΠ΅Π½ΠΎΠΌ (Tom Christiansen) Π² октябрС 1993 Π³ΠΎΠ΄Π° Π½Π° Usenet post

Π”Π°Π»Π΅Π΅, Π² тСкстС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ большоС количСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² скриптов, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… возмоТности shell. ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ -- Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅. Они Π±Ρ‹Π»ΠΈ протСстированы, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² повсСднСвной Ρ€Π°Π±ΠΎΡ‚Π΅. Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ΡŒ "ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ" с Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ скриптов, сохраняя ΠΈΡ… Π² Ρ„Π°ΠΉΠ»Ρ‹, с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ scriptname.sh.[ 3 ] НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π²Ρ‹Π΄Π°Ρ‚ΡŒ этим Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΏΡ€Π°Π²ΠΎ Π½Π° исполнСниС (chmod u+rx scriptname), послС Ρ‡Π΅Π³ΠΎ сцСнарии ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π° исполнСниС ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Π°ΠΌ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ описаниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² слСдуСт послС исходного ΠΊΠΎΠ΄Π° этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, поэтому, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сцСнарий Ρƒ сСбя -- ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π΅Π³ΠΎ описаниСм.

Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ написаны Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ½ΠΈΠ³ΠΈ, Ссли Π½Π΅ оговариваСтся ΠΈΠ½ΠΎΠ΅.


Π“Π»Π°Π²Π° 2. Для Π½Π°Ρ‡Π°Π»Π° ΠΎ Sha-Bang

Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС, скрипт -- это Π½ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ простой список ΠΊΠΎΠΌΠ°Π½Π΄ систСмы, записанный Π² Ρ„Π°ΠΉΠ». Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ скриптов ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ вашС врСмя ΠΈ силы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тратятся Π½Π° Π²Π²ΠΎΠ΄ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2-1. cleanup: Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ очистки Π»ΠΎΠ³-Ρ„Π°ΠΉΠ»ΠΎΠ² Π² /var/log

# cleanup

# Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ сцСнария Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²Π° root.


cd /var/log

cat /dev/null > messages

cat /dev/null > wtmp

echo "Π›ΠΎΠ³-Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡ‡ΠΈΡ‰Π΅Π½Ρ‹."

Π—Π΄Π΅ΡΡŒ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ, это простая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π±Ρ€Π°Π½Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС с консоли ΠΈΠ»ΠΈ Π² xterm. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ размСщСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ Π² скриптС состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ придСтся всякий Ρ€Π°Π· Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ эту ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, скрипты Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Ρ‹ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2-2. cleanup: Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ вСрсия ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ сцСнария.

#!/bin/bash

# cleanup, version 2

# Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ сцСнария Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²Π° root.


LOG_DIR=/var/log

ROOT_UID=0 # Волько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ с $UID 0 ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ root.

LINES=50 # ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ сохраняСмых строк ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

E_XCD=66 # НСвозмоТно ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³?

E_NOTROOT=67 # ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ отсутствия root-ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ.


if [ "$UID" -ne "$ROOT_UID" ]

then

echo "Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ сцСнария Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²Π° root."

exit $E_NOTROOT

fi


if [ -n "$1" ]

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

then

lines=$1

else

lines=$LINES # Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли число Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС

fi


# Stephane Chazelas ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅,

#+ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ коррСктности Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки,

#+ ΠΏΡ€Π°Π²Π΄Π° это достаточно слоТно для Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства.

#

# E_WRONGARGS=65 # НС числовой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚

#

# case "$1" in

# "" ) lines=50;;

# *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;;

# * ) lines=$1;;

# esac

#