Table Of ContentAdvanced Bash-Scripting Guide
Искусство программирования на языке
сценариев командной оболочки
Автор: Mendel Cooper
thegrendel@theriver.com
Перевод: Андрей Киселев
kis_an@mail.ru
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