Advanced Bash Scripting по-русски

Детальное руководство по искусству shell-скриптинга

6.0.41

25 August 2009

История переиздания
Издание 5.523 Nov 2008mc
'FARKLEBERRY' release: Minor Update.
Издание 5.626 Jan 2009mc
'WORCESTERBERRY' release: Minor Update.
Издание 6.023 Mar 2009mc
'THIMBLEBERRY' release: Major Update.
Издание $Revision$$Date$$Author$
Русский перевод от www.bash-scripting.ru

Аннотация

Данное руководство не предполагает наличия у читателя опыта скриптования или программирования, однако быстро восполняет этот недостаток . . . постепенно, шаг за шагом раскрывая мудрость и красоту UNIX® . Это руководство может служить, как книгой для самостоятельного изучения, так и справочником по технике программирования на shell. Руководство снабжено большим количеством хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев -- это написание сценариев.

Эта книга так же может служить учебным пособием по основам программирования.


Посвящается Аните — источнику очарования.

Содержание

Часть 1. Введение
1. Программирование на Shell!
2. Для начала о Sha-Bang
Запуск сценария
Упражнения
Part 2. Основы
3. Специальные символы
4. Введение в переменные и параметры
Подстановка переменных
Присваивание значений переменным
Переменные Bash не типизированы
Специальные типы переменных
5. Использование кавычек
Заключение переменных в кавычки
Экранирование символов
6. Exit and Exit Status
7. Проверка условий
Конструкции проверки условий
Операторы проверки файлов
Другие операторы сравнения
Вложенные конструкции проверки if/then
Проверка знаний по теме "Проверка условий"
8. Operations and Related Topics
Operators
Numerical Constants
Part 3. Углубленный материал
9. К вопросу о переменных
Внутренние Переменные
Manipulating Strings
Manipulating strings using awk
Further Reference
Parameter Substitution
Typing variables: declare or typeset
Another use for declare
Indirect References
$RANDOM: generate random integer
The Double-Parentheses Construct
10. Циклы и ветвления
Циклы
Вложенные циклы
Управление ходом выполнения цикла
Проверки и ветвления
11. Command Substitution
12. Раскрытие арифметических выражений
13. Recess Time
Part 4. Commands
14. Internal Commands and Builtins
Job Control Commands
15. External Filters, Programs and Commands
Basic Commands
Complex Commands
Time / Date Commands
Text Processing Commands
File and Archiving Commands
Communications Commands
Terminal Control Commands
Math Commands
Miscellaneous Commands
16. System and Administrative Commands
Analyzing a System Script
Part 5. Материал повышенной сложности
17. Регулярные выражения
Краткое введение в регулярные выражения
Глоббинг
18. Встроенные документы
Встроенные строки
19. I/O Redirection
Using exec
Redirecting Code Blocks
Applications
20. Subshells
21. Restricted Shells
22. Process Substitution
23. Функции
Сложные функции и сложности функций
Локальные переменные
Локальные переменные и рекурсия.
Рекурсия без локальных переменных
24. Псевдонимы
25. List Constructs
26. Arrays
27. /dev and /proc
/dev
/proc
28. Of Zeros and Nulls
29. Debugging
30. Options
31. Gotchas
32. Scripting With Style
Unofficial Shell Scripting Stylesheet
33. Miscellany
Interactive and non-interactive shells and scripts
Operator Precedence
Shell Wrappers
Tests and Comparisons: Alternatives
A script calling itself (recursion)
«Colorizing» Scripts
Optimizations
Assorted Tips
Ideas for more powerful scripts
Widgets
Security Issues
Infected Shell Scripts
Hiding Shell Script Source
Writing Secure Shell Scripts
Portability Issues
A Test Suite
Shell Scripting Under Windows
34. Bash, versions 2, 3, and 4
Bash, version 2
Bash, version 3
Bash, version 3.1
Bash, version 3.2
Bash, version 4
35. Endnotes
Author's Note
About the Author
Where to Go For Help
Tools Used to Produce This Book
Hardware
Software and Printware
Credits
Disclaimer
Литература
A. Contributed Scripts
B. Reference Cards
C. A Sed and Awk Micro-Primer
Sed
Awk
D. Exit Codes With Special Meanings
E. A Detailed Introduction to I/O and I/O Redirection
F. Command-Line Options
Standard Command-Line Options
Bash Command-Line Options
G. Important Files
H. Important System Directories
I. An Introduction to Programmable Completion
J. Localization
K. History Commands
L. A Sample .bashrc File
M. Converting DOS Batch Files to Shell Scripts
N. Exercises
Analyzing Scripts
Writing Scripts
O. Revision History
P. Download and Mirror Sites
Q. To Do List
R. Copyright
S. ASCII Table
Предметный указатель

Список таблиц

14.1. Job identifiers
30.1. Bash options
33.1. Numbers representing colors in Escape Sequences
B.1. Special Shell Variables
B.2. TEST Operators: Binary Comparison
B.3. TEST Operators: Files
B.4. Parameter Substitution and Expansion
B.5. String Operations
B.6. Miscellaneous Constructs
C.1. Basic sed operators
C.2. Examples of sed operators
D.1. Reserved Exit Codes
M.1. Batch file keywords / variables / operators, and their shell equivalents
M.2. DOS commands and their UNIX equivalents
O.1. Revision History

Список примеров

2.1. Очистка: Скрипт для очистки файлов в /var/log
2.2. Очистка: Улучшеный скрипт
2.3. Очистка: Расширенная, и более универсальная версия скрипта.
3.1. Code blocks and I/O redirection
3.2. Saving the output of a code block to a file
3.3. Running a loop in the background
3.4. Backup of all files changed in last day
4.1. Присваивание значений и подстановка переменных
4.2. Простое присваивание значений переменным
4.3. Присваивание значений, простое и особое
4.4. Целое число или строка?
4.5. Позиционные параметры
4.6. wh, whois просмотр имени домена
4.7. Использование shift
5.1. Вывод "своеобразных" переменных
5.2. Экранирование символов
6.1. exit / exit status
6.2. Negating a condition using !
7.1. Что есть истина?
7.2. Эквиваленты test, /usr/bin/test, [ ], и /usr/bin/[
7.3. Арифметические проверки с использованием (( ))
7.4. Проверка ссылок на корректность
7.5. Арифметические и строковые сравнения
7.6. Проверка пустых (null) строк
7.7. zmore
8.1. Greatest common divisor
8.2. Using Arithmetic Operations
8.3. Compound Condition Tests Using && and ||
8.4. Representation of numerical constants
9.1. $IFS and whitespace
9.2. Timed Input
9.3. Once more, timed input
9.4. Timed read
9.5. Am I root?
9.6. arglist: Listing arguments with $* and $@
9.7. Inconsistent $* and $@ behavior
9.8. $* and $@ when $IFS is empty
9.9. Underscore variable
9.10. Inserting a blank line between paragraphs in a text file
9.11. Generating an 8-character «random» string
9.12. Converting graphic file formats, with filename change
9.13. Converting streaming audio files to ogg
9.14. Emulating getopt
9.15. Alternate ways of extracting and locating substrings
9.16. Using parameter substitution and error messages
9.17. Parameter substitution and «usage» messages
9.18. Length of a variable
9.19. Pattern matching in parameter substitution
9.20. Renaming file extensions:
9.21. Using pattern matching to parse arbitrary strings
9.22. Matching patterns at prefix or suffix of string
9.23. Using declare to type variables
9.24. Indirect Variable References
9.25. Passing an indirect reference to awk
9.26. Generating random numbers
9.27. Picking a random card from a deck
9.28. Brownian Motion Simulation
9.29. Random between values
9.30. Rolling a single die with RANDOM
9.31. Reseeding RANDOM
9.32. Pseudorandom numbers, using awk
9.33. C-style manipulation of variables
10.1. Простой цикл for
10.2. Цикл for с двумя параметрами в каждом из элементов списка
10.3. Fileinfo: обработка списка файлов, содержащегося в переменной
10.4. Обработка списка файлов в цикле for
10.5. Цикл for без списка аргументов
10.6. Создание списка аргументов в цикле for с помощью подстановки команд
10.7. grep для бинарных файлов
10.8. Список всех пользователей системы
10.9. Проверка авторства всех бинарных файлов в каталоге
10.10. Список символических ссылок в каталоге.
10.11. Список символических ссылок в каталоге, сохраняемый в файле
10.12. C-подобный синтаксис оператора цикла for
10.13. Использование команды efax в пакетном режиме
10.14. Простой цикл while
10.15. Другой пример цикла while
10.16. Цикл while loop с несколькими условиями
10.17. C-подобный синтаксис оформления цикла while
10.18. until loop
10.19. Вложенный цикл
10.20. Результат работы break и continue в цикле
10.21. Прерывание многоуровневых циклов
10.22. Передача управления с помощью continue в начало внешнего цикла
10.23. Реальный пример использования команды continue N
10.24. Использование case
10.25. Создание меню, используя case
10.26. Использование подстановки команды для генерирования значения переменной для case.
10.27. Простое сравнение строк
10.28. Проверка ввода буквенных символов
10.29. Создание меню, используя select
10.30. Создание меню, используя selectв функции
11.1. Stupid script tricks
11.2. Generating a variable from a loop
11.3. Finding anagrams
14.1. A script that spawns multiple instances of itself
14.2. printf in action
14.3. Variable assignment, using read
14.4. What happens when read has no variable
14.5. Multi-line input to read
14.6. Detecting the arrow keys
14.7. Using read with file redirection
14.8. Problems reading from a pipe
14.9. Changing the current working directory
14.10. Letting let do arithmetic.
14.11. Showing the effect of eval
14.12. Using eval to select among variables
14.13. Echoing the command-line parameters
14.14. Forcing a log-off
14.15. A version of rot13
14.16. Using set with positional parameters
14.17. Reversing the positional parameters
14.18. Reassigning the positional parameters
14.19. «Unsetting» a variable
14.20. Using export to pass a variable to an embedded awk script
14.21. Using getopts to read the options/arguments passed to a script
14.22. «Including» a data file
14.23. A (useless) script that sources itself
14.24. Effects of exec
14.25. A script that exec's itself
14.26. Waiting for a process to finish before proceeding
14.27. A script that kills itself
15.1. Using ls to create a table of contents for burning a CDR disk
15.2. Hello or Good-bye
15.3. Badname, eliminate file names in current directory containing bad characters and whitespace.
15.4. Deleting a file by its inode number
15.5. Logfile: Using xargs to monitor system log
15.6. Copying files in current directory to another
15.7. Killing processes by name
15.8. Word frequency analysis using xargs
15.9. Using expr
15.10. Using date
15.11. Date calculations
15.12. Word Frequency Analysis
15.13. Which files are scripts?
15.14. Generating 10-digit random numbers
15.15. Using tail to monitor the system log
15.16. Printing out the From lines in stored e-mail messages
15.17. Emulating grep in a script
15.18. Crossword puzzle solver
15.19. Looking up definitions in Webster's 1913 Dictionary
15.20. Checking words in a list for validity
15.21. toupper: Transforms a file to all uppercase.
15.22. lowercase: Changes all filenames in working directory to lowercase.
15.23. du: DOS to UNIX text file conversion.
15.24. rot13: ultra-weak encryption.
15.25. Generating «Crypto-Quote» Puzzles
15.26. Formatted file listing.
15.27. Using column to format a directory listing
15.28. nl: A self-numbering script.
15.29. manview: Viewing formatted manpages
15.30. Using cpio to move a directory tree
15.31. Unpacking an rpm archive
15.32. Stripping comments from C program files
15.33. Exploring /usr/X11R6/bin
15.34. An «improved» strings command
15.35. Using cmp to compare two files within a script.
15.36. basename and dirname
15.37. A script that copies itself in sections
15.38. Checking file integrity
15.39. Uudecoding encoded files
15.40. Finding out where to report a spammer
15.41. Analyzing a spam domain
15.42. Getting a stock quote
15.43. Updating FC4
15.44. Using ssh
15.45. A script that mails itself
15.46. Generating prime numbers
15.47. Monthly Payment on a Mortgage
15.48. Base Conversion
15.49. Invoking bc using a here document
15.50. Calculating PI
15.51. Converting a decimal number to hexadecimal
15.52. Factoring
15.53. Calculating the hypotenuse of a triangle
15.54. Using seq to generate loop arguments
15.55. Letter Count"
15.56. Using getopt to parse command-line options
15.57. A script that copies itself
15.58. Exercising dd
15.59. Capturing Keystrokes
15.60. Securely deleting a file
15.61. Filename generator
15.62. Converting meters to miles
15.63. Using m4
16.1. Setting a new password
16.2. Setting an erase character
16.3. secret password: Turning off terminal echoing
16.4. Keypress detection
16.5. Checking a remote server for identd
16.6. pidof helps kill a process
16.7. Checking a CD image
16.8. Creating a filesystem in a file
16.9. Adding a new hard drive
16.10. Using umask to hide an output file from prying eyes
16.11. killall, from /etc/rc.d/init.d
18.1. Широковещательная рассылка: Отправить сообщение всем пользователям, вошедшим в систему
18.2. dummyfile: Создание 2-х строчного демонстрационного файла
18.3. Многострочное сообщение, использующее cat
18.4. Многострочное выражение с исключенными символами табуляции
18.5. Встроенный документ с заменяемыми параметрами
18.6. Загрузить пару файлов в удаленную директорию Sunsite
18.7. Выключение подстановки параметров
18.8. Сценарий, генерирующий другой сценарий
18.9. Встроенные документы и функции
18.10. «Анонимный» встроенный документ
18.11. Комментирование блоков кода
18.12. Самодокументирующийся сценарий
18.13. Добавление строки в файл
18.14. Разбор файла почтового ящика
19.1. Redirecting stdin using exec
19.2. Redirecting stdout using exec
19.3. Redirecting both stdin and stdout in the same script with exec
19.4. Avoiding a subshell
19.5. Redirected while loop
19.6. Alternate form of redirected while loop
19.7. Redirected until loop
19.8. Redirected for loop
19.9. Redirected for loop (both stdin and stdout redirected)
19.10. Redirected if/then test
19.11. Data file names.data for above examples
19.12. Logging events
20.1. Variable scope in a subshell
20.2. List User Profiles
20.3. Running parallel processes in subshells
21.1. Running a script in restricted mode
22.1. Code block redirection without forking
23.1. Простые функции
23.2. Функция Принимающая Параметры
23.3. Функции и аргументы командной строки переданные в сценарий
23.4. Передача косвенной ссылки в функцию
23.5. Разыменовывание параметра переданного в функцию
23.6. Ещё одно разыменовывание параметра переданного в функцию
23.7. Максимум из двух чисел
23.8. Перевод чисел в Римские цифры
23.9. Тестирование возврата больших значений из функции
23.10. Сравнение двух больших целых чисел
23.11. Настоящее имя по имени пользователя
23.12. Local variable visibility
23.13. Демонстрация простой рекурсивной функции
23.14. Другая простая демонстрация
23.15. Рекурсия с использованием локальных переменных
23.16. Последовательность чисел Фибоначчи
23.17. Ханойская Башня
24.1. Псевдонимы внутри сценария
24.2. unalias: Установка и удаление псевдонима
25.1. Using an and list to test for command-line arguments
25.2. Another command-line arg test using an and list
25.3. Using or lists in combination with an and list
26.1. Simple array usage
26.2. Formatting a poem
26.3. Various array operations
26.4. String operations on arrays
26.5. Loading the contents of a script into an array
26.6. Some special properties of arrays
26.7. Of empty arrays and empty elements
26.8. Initializing arrays
26.9. Copying and concatenating arrays
26.10. More on concatenating arrays
26.11. The Bubble Sort
26.12. Embedded arrays and indirect references
26.13. The Sieve of Eratosthenes
26.14. The Sieve of Eratosthenes, Optimized
26.15. Emulating a push-down stack
26.16. Complex array application: Exploring a weird mathematical series
26.17. Simulating a two-dimensional array, then tilting it
27.1. Using /dev/tcp for troubleshooting
27.2. Playing music
27.3. Finding the process associated with a PID
27.4. On-line connect status
28.1. Hiding the cookie jar
28.2. Setting up a swapfile using /dev/zero
28.3. Creating a ramdisk
29.1. A buggy script
29.2. Missing keyword
29.3. test24: another buggy script
29.4. Testing a condition with an assert
29.5. Trapping at exit
29.6. Cleaning up after Control-C
29.7. Tracing a variable
29.8. Running multiple processes (on an SMP box)
31.1. Numerical and string comparison are not equivalent
31.2. Subshell Pitfalls
31.3. Piping the output of echo to a read
33.1. shell wrapper
33.2. A slightly more complex shell wrapper
33.3. A generic shell wrapper that writes to a logfile
33.4. A shell wrapper around an awk script
33.5. A shell wrapper around another awk script
33.6. Perl embedded in a Bash script
33.7. Bash and Perl scripts combined
33.8. A (useless) script that recursively calls itself
33.9. A (useful) script that recursively calls itself
33.10. Another (useful) script that recursively calls itself
33.11. A «colorized» address database
33.12. Drawing a box
33.13. Echoing colored text
33.14. A «horserace» game
33.15. A Progress Bar
33.16. Return value trickery
33.17. Even more return value trickery
33.18. Passing and returning arrays
33.19. Fun with anagrams
33.20. Widgets invoked from a shell script
33.21. Test Suite
34.1. String expansion
34.2. Indirect variable references - the new way
34.3. Simple database application, using indirect variable referencing
34.4. Using arrays and other miscellaneous trickery to deal four random hands from a deck of cards
34.5. A simple address database
34.6. A somewhat more elaborate address database
34.7. Testing characters
A.1. mailformat: Formatting an e-mail message
A.2. rn: A simple-minded file renaming utility
A.3. blank-rename: Renames filenames containing blanks
A.4. encryptedpw: Uploading to an ftp site, using a locally encrypted password
A.5. copy-cd: Copying a data CD
A.6. Collatz series
A.7. days-between: Days between two dates
A.8. Making a dictionary
A.9. Soundex conversion
A.10. Game of Life
A.11. Data file for Game of Life
A.12. behead: Removing mail and news message headers
A.13. password: Generating random 8-character passwords
A.14. fifo: Making daily backups, using named pipes
A.15. Generating prime numbers using the modulo operator
A.16. tree: Displaying a directory tree
A.17. tree2: Alternate directory tree script
A.18. string functions: C-style string functions
A.19. Directory information
A.20. Library of hash functions
A.21. Colorizing text using hash functions
A.22. More on hash functions
A.23. Mounting USB keychain storage devices
A.24. Converting to HTML
A.25. Preserving weblogs
A.26. Protecting literal strings
A.27. Unprotecting literal strings
A.28. Spammer Identification
A.29. Spammer Hunt
A.30. Making wget easier to use
A.31. A podcasting script
A.32. Nightly backup to a firewire HD
A.33. An expanded cd command
A.34. A soundcard setup script
A.35. Locating split paragraphs in a text file
A.36. Insertion sort
A.37. Standard Deviation
A.38. A pad file generator for shareware authors
A.39. A man page editor
A.40. Petals Around the Rose
A.41. Quacky: a Perquackey-type word game
A.42. Nim
A.43. A command-line stopwatch
A.44. An all-purpose shell scripting homework assignment solution
A.45. The Knight's Tour
A.46. Magic Squares
A.47. Fifteen Puzzle
A.48. The Towers of Hanoi, graphic version
A.49. The Towers of Hanoi, alternate graphic version
A.50. An alternate version of the getopt-simple.sh script
A.51. The version of the UseGetOpt.sh example used in the Tab Expansion appendix
A.52. Cycling through all the possible color backgrounds
A.53. Basics Reviewed
C.1. Counting Letter Occurrences
I.1. Completion script for UseGetOpt.sh
L.1. Sample .bashrc file
M.1. VIEWDATA.BAT: DOS Batch File
M.2. viewdata.sh: Shell Script Conversion of VIEWDATA.BAT
Q.1. Print the server environment
S.1. A script that generates an ASCII table