Advanced Bash-Scripting Guide Искусство программирования на языке сценариев командной оболочки Автор: Mendel Cooper [email protected] Перевод: Андрей Киселев [email protected] Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки byАвтор:MendelCooper byПеревод:АндрейКиселев Published19July2003 Данноеруководствонепредполагаетналичиеучитателяпознанийвобластипрограммированияна языкесценариев,однако,быстровосполняетэтотнедостаток...постепенно,шагзашагомраскрывая мудростьикрасотуUNIX.Эторуководствоможетрассматриватьсякакучебник,предназначенный длясамостоятельногоизученияиликаксправочникпопрограммированиюнаshell.Руководство снабженосериейхорошопрокомментированныхпримеров,посколькулучший путь к изучению языка сценариев -- это написание сценариев. Последнююверсиюдокумента,ввиде.bz2архива,содержащемисходныетекстывформатеSGMLи HTML,вынайдетена домашнейстраничкеавтора (http://personal.riverusers.com/~thegrendel/abs-guide-1.8.tar.bz2).Тамжевынайдетеиchangelog (http://personal.riverusers.com/~thegrendel/Change.log). RevisionHistory Revision0.1 14June2000 Revisedby:mc Первыйвыпуск. Revision0.2 30October2000 Revisedby:mc Исправленияидополнения. Revision0.3 12February2001 Revisedby:mc Значительныедополнения. Revision0.4 08July2001 Revisedby:mc Исправления.Добавленновыйматериал,примерысценариев. Revision0.5 03September2001Revisedby:mc Значительныедополнения.Исправления.Реорганизацияструктурыкниги. Revision1.0 14October2001 Revisedby:mc Исправленияидополнения."Стабильный"выпуск. Revision1.1 06January2002 Revisedby:mc Исправленияидополнения. Revision1.2 31March2002 Revisedby:mc Исправленияидополнения. Revision1.3 02June2002 Revisedby:mc ’TANGERINE’release:Исправленияидополнения. Revision1.4 16June2002 Revisedby:mc ’MANGO’release:Исправленияидополнения. Revision1.5 13July2002 Revisedby:mc ’PAPAYA’release:Исправленияидополнения. Revision1.6 29September2002Revisedby:mc ’POMEGRANATE’release:Исправленияидополнения. Revision1.7 05January2003 Revisedby:mc ’COCONUT’release:Исправленияидополнения. Revision1.8 10May2003 Revisedby:mc ’BREADFRUIT’release:Исправленияидополнения. Revision1.9 21June2003 Revisedby:mc ’PERSIMMON’release:Исправленияидополнения. Revision1.9.319July2003 Revisedby:mc Промежуточныйвыпускперед’GOOSEBERRY’release. Dedication ПосвящаетсяАните--источникуочарования Table of Contents Часть1.Введение...............................................................................................................................ix 1.ЗачемнеобходимознаниеязыкаShell?..................................................................................1 2.ДляначалаоSha-Bang...............................................................................................................4 2.1.Запусксценария.............................................................................................................7 2.2.Упражнения....................................................................................................................7 Часть2.Основы..................................................................................................................................10 3.Служебныесимволы................................................................................................................11 4.Переменныеипараметры.Введение....................................................................................34 4.1.Подстановкапеременных...........................................................................................34 4.2.Присваиваниезначенийпеременным......................................................................37 4.3.ПеременныеBashнеимеюттипа...............................................................................39 4.4.Специальныетипыпеременных...............................................................................40 5.Кавычки.....................................................................................................................................46 6.Завершениеикодзавершения...............................................................................................55 7.Проверкаусловий.....................................................................................................................57 7.1.Конструкциипроверкиусловий...............................................................................57 7.2.Операциипроверкифайлов.......................................................................................64 7.3.Операциисравнения...................................................................................................68 7.4.Вложенныеусловныеоператорыif/then..................................................................76 7.5.Проверкастепениусвоенияматериала...................................................................76 8.Операцииисмежныетемы.....................................................................................................78 8.1.Операторы.....................................................................................................................78 8.2.Числовыеконстанты...................................................................................................86 Часть3.Углубленныйматериал.................................................................................................88 9.Квопросуопеременных.........................................................................................................89 9.1.Внутренниепеременные.............................................................................................89 9.2.Работасостроками...................................................................................................110 9.3.Подстановкапараметров.........................................................................................117 9.4.Объявлениепеременных:declareиtypeset............................................................128 9.5.Косвенныессылкинапеременные.........................................................................130 9.6.$RANDOM:генерацияпсевдослучайныхцелыхчисел.......................................133 9.7.Двойныекруглыескобки.........................................................................................139 10.Циклыиветвления..............................................................................................................142 10.1.Циклы........................................................................................................................142 10.2.Вложенныециклы...................................................................................................154 10.3.Управлениеходомвыполненияцикла.................................................................155 10.4.Операторывыбора...................................................................................................159 11.Внутренниекоманды...........................................................................................................168 11.1.Командыуправлениязаданиями.........................................................................193 12.Внешниекоманды,программыиутилиты......................................................................199 12.1.Базовыекоманды.....................................................................................................199 12.2.Болеесложныекоманды........................................................................................203 12.3.Командыдляработысдатойивременем...........................................................211 12.4.Командыобработкитекста....................................................................................215 12.5.Командыдляработысфайламииархивами....................................................235 v 12.6.Командыдляработыссетью................................................................................255 12.7.Командыуправлениятерминалом.......................................................................261 12.8.Командывыполненияматематическихопераций.............................................262 12.9.Прочиекоманды......................................................................................................273 13.Командысистемногоадминистрирования......................................................................286 14.Подстановкакоманд............................................................................................................317 15.Арифметическиеподстановки...........................................................................................324 16.Перенаправлениеввода/вывода........................................................................................325 16.1.Спомощьюкомандыexec.......................................................................................328 16.2.Перенаправлениедляблоковкода.......................................................................331 16.3.Областьприменения...............................................................................................335 17.Встроенныедокументы.......................................................................................................338 Часть4.Материалповышеннойсложности........................................................................347 18.Регулярныевыражения......................................................................................................348 18.1.Краткоевведениеврегулярныевыражения......................................................348 18.2.Globbing--Подстановкаименфайлов.................................................................354 19.Подоболочки,илиSubshells................................................................................................357 20.Ограниченныйрежимкоманднойоболочки...................................................................361 21.Подстановкапроцессов.......................................................................................................363 22.Функции.................................................................................................................................366 22.1.Сложныефункцииисложностисфункциями..................................................368 22.2.Локальныепеременные..........................................................................................377 23.Псевдонимы...........................................................................................................................382 24.Спискикоманд......................................................................................................................385 25.Массивы.................................................................................................................................388 26.Файлы.....................................................................................................................................410 27./devи/proc..............................................................................................................................411 27.1./dev............................................................................................................................411 27.2./proc..........................................................................................................................411 28./dev/zeroи/dev/null.................................................................................................................417 29.Отладкасценариев...............................................................................................................421 30.Необязательныепараметры(ключи)...............................................................................429 31.Широкораспространенныеошибки.................................................................................433 32.Стильпрограммирования...................................................................................................440 32.1.Неофициальныерекомендациипооформлениюсценариев............................440 33.Разное.....................................................................................................................................444 33.1.Интерактивныйинеинтерактивныйрежимработы........................................444 33.2.Сценарии-обертки....................................................................................................445 33.3.Операциисравнения:Альтернативныерешения..............................................449 33.4.Рекурсия....................................................................................................................450 33.5.“Цветные”сценарии................................................................................................451 33.6.Оптимизация............................................................................................................456 33.7.Разныесоветы..........................................................................................................457 33.8.Проблемыбезопасности.........................................................................................466 33.9.Проблемыпереносимости......................................................................................467 33.10.СценариикоманднойоболочкиподWindows...................................................468 34.Bash,версия2.........................................................................................................................469 vi 35.Замечанияидополнения........................................................................................................475 35.1.Отавтора............................................................................................................................475 35.2.Обавторе.............................................................................................................................475 35.3.Инструменты,использовавшиесяприсозданиикниги..............................................475 35.3.1.Аппаратура............................................................................................................476 35.3.2.Программноеобеспечение...................................................................................476 35.4.Благодарности...................................................................................................................476 Bibliography...........................................................................................................................................479 A.Дополнительныепримерысценариев...............................................................................486 B.МаленькийучебникпоSedиAwk..........................................................................................531 B.1.Sed..........................................................................................................................................531 B.2.Awk.........................................................................................................................................535 C.Кодызавершения,имеющиепредопределенныйсмысл...........................................538 D.Подробноевведениевоперацииввода-выводаиперенаправление ввода-вывода............................................................................................................................540 E.Локализация.................................................................................................................................543 F.Историякоманд...........................................................................................................................546 G.Примерфайла.bashrc.............................................................................................................548 H.Преобразованиепакетных(*.bat)файловDOSвсценариикоманднойоболочки 561 I.Упражнения...................................................................................................................................566 I.1.Анализсценариев.................................................................................................................566 I.2.Созданиесценариев.............................................................................................................567 J.Авторскиеправа..........................................................................................................................576 vii List of Tables 11-1.Идентификациязаданий...........................................................................................................197 30-1.КлючиBash..................................................................................................................................430 33-1.Числовыезначенияцветавescape-последовательностях...................................................454 B-1.Основныеоперацииsed...............................................................................................................532 B-2.Примерыоперацийвsed.............................................................................................................533 C-1.“Зарезервированные”кодызавершения.................................................................................538 H-1.Ключевыеслова/переменные/операторыпакетныхфайловDOSииханалогикомандной оболочки.......................................................................................................................................561 H-2.КомандыDOSиихэквивалентывUNIX................................................................................562 viii Часть 1. Введение Shell--этокоманднаяоболочка.Ноэтонепростопромежуточноезвеномежду пользователемиоперационойсистемой,этоещеимощныйязыкпрограммирования. Программынаязыкеshellназываютсценариями,илискриптами.Фактически,изскриптов доступенполныйнаборкоманд,утилитипрограммUNIX.Еслиэтогонедостаточно,ток вашимуслугамвнутренниекомандыshell--условныеоператоры,операторыцикловипр., которыеувеличиваютмощьигибкостьсценариев.Shell-скриптыисключительнохороши припрограммированиизадачадминистрированиясистемыидр.,которыенетребуютдля своегосозданияполновесныхязыковпрограммирования. Chapter 1. Зачем необходимо знание языка Shell? Знаниеязыкакоманднойоболочкиявляетсязалогомуспешногорешениязадач администрированиясистемы.Дажеесливынепредполагаетезаниматьсянаписаниемсвоих сценариев.ВовремязагрузкиLinuxвыполняетсяцелыйрядсценариевиз/etc/rc.d, которыенастраиваютконфигурациюоперационнойсистемыизапускаютразличные сервисы,поэтомуоченьважночеткопониматьэтискриптыииметьдостаточнознаний, чтобывноситьвнихкакиелибоизменения. Языксценариевлегоквизучении,внемнетакмногоспецифическихоператорови конструкций.1Синтаксисязыкадостаточнопростипрямолинеен,оноченьнапоминает команды,которыеприходитсявводитьвкоманднойстроке.Короткиескриптыпрактически ненуждаютсявотладке,идажеотладкабольшихскриптовотнимаетвесьма незначительноевремя. Shell-скриптыоченьхорошоподходятдлябыстрогосозданияпрототиповсложных приложений,даженесмотрянаограниченныйнаборязыковыхконструкцийи определенную"медлительность".Такаяметодапозволяетдетальнопроработатьструктуру будущегоприложения,обнаружитьвозможные"ловушки"илишьзатемприступитьк кодированиюнаC,C++,Java,илиPerl. СкриптывозвращаютнаскклассическойфилософииUNIX--"разделяйивлавствуй"т.е. разделениесложногопроектанарядпростыхподзадач.Многиесчитаюттакойподход наилучшимили,поменьшеймере,наиболееэстетичнымспособомрешениявозникающих проблем,нежелииспользованиеновогопоколенияязыков--"все-в-одном",такихкакPerl. Длякакихзадачнеприменимыскрипты • дляресурсоемкихзадач,особеннокогдаважнаскоростьисполнения(поиск,сортировкаи т.п.) • длязадач,связанныхсвыполнениемматематическихвычислений,особенноэтокасается вычисленийсплавающейзапятой,вычисленийсповышеннойточностью,комплексных чисел(длятакихзадачлучшеиспользоватьC++илиFORTRAN) • длякросс-платформенногопрограммирования(дляэтоголучшеподходитязыкC) • длясложныхприложений,когдаструктурированиеявляетсяжизненнойнеобходимостью (контрользатипамипеременных,прототипамифункцийит.п.) • дляцелевыхзадач,откоторыхможетзависетьуспехпредприятия. • когдавоглавууглапоставленабезопасностьсистемы,когданеобходимообеспечить целостностьсистемыизащититьееотвторжения,взломаивандализма. • дляпроектов,содержащихкомпоненты,оченьтесновзаимодействующиемеждусобой. 1