- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Искусство программирования на языке сценариев командной оболочки - Мендель Купер
Шрифт:
Интервал:
Закладка:
# но через год-другой будет очень тяжело вспомнить -- что она делает.
# (Из сценария "pw.sh", автор: Antek Sawicki)
Добавляйте заголовочные комментарии в начале сценария и перед функциями.
#!/bin/bash
#************************************************#
# xyz.sh #
# автор: Bozo Bozeman #
# Июль 05, 2001 #
# #
# Удаление файлов проекта. #
#************************************************#
BADDIR=65 # Нет такого каталога.
projectdir=/home/bozo/projects # Каталог проекта.
# ------------------------------------------------------- #
# cleanup_pfiles () #
# Удаляет все файлы в заданном каталоге. #
# Параметры: $target_directory #
# Возвращаемое значение: 0 -- в случае успеха, #
# $BADDIR -- в случае ошибки. #
# ------------------------------------------------------- #
cleanup_pfiles ()
{
if [ ! -d "$1" ] # Проверка существования заданного каталога.
then
echo "$1 -- не является каталогом."
return $BADDIR
fi
rm -f "$1"/*
return 0 # Успешное завершение функции.
}
cleanup_pfiles $projectdir
exit 0
Не забывайте начинать ваш сценарий с sha-bang -- #!/bin/bash.
Заменяйте повторяющиеся значения константами. Это сделает ваш сценарий более простым для понимания и позволит вносить изменения, не опасаясь за его работоспособность.
if [ -f /var/log/messages ]
then
...
fi
# Представьте себе, что через пару лет
# вы захотите изменить /var/log/messages на /var/log/syslog.
# Тогда вам придется отыскать все строки,
# содержащие /var/log/messages, и заменить их на /var/log/syslog.
# И проверить несколько раз -- не пропустили ли что-нибудь.
# Использование "констант" дает лучший способ:
LOGFILE=/var/log/messages # Если и придется изменить, то только в этой строке.
if [ -f "$LOGFILE" ]
then
...
fi
В качестве имен переменных и функций выбирайте осмысленные названия.
fl=`ls -al $dirname` # Не очень удачное имя переменной.
file_listing=`ls -al $dirname` # Уже лучше.
MAXVAL=10 # Пишите имена констант в верхнем регистре.
while [ "$index" -le "$MAXVAL" ]
...
E_NOTFOUND=75 # Имена кодов ошибок -- в верхнем регистре,
# к тому же, их желательно дополнять префиксом "E_".
if [ ! -e "$filename" ]
then
echo "Файл $filename не найден."
exit $E_NOTFOUND
fi
MAIL_DIRECTORY=/var/spool/mail/bozo # Имена переменных окружения
# так же желательно записывать символами
# в верхнем регистре.
export MAIL_DIRECTORY
GetAnswer () # Смешивание символов верхнего и нижнего решистров
# удобно использовать для имен функций.
{
prompt=$1
echo -n $prompt
read answer
return $answer
}
GetAnswer "Ваше любимое число? "
favorite_number=$?
echo $favorite_number
_uservariable=23 # Допустимо, но не рекомендуется.
# Желательно, чтобы пользовательские переменные не начинались с символа подчеркивания.
# Так обычно начинаются системные переменные.
Используйте смысловые имена для кодов завершения.
E_WRONG_ARGS=65
...
...
exit $E_WRONG_ARGS
См. так же Приложение C.
Разделяйте большие сложные сценарии на серию более коротких и простых модулей. Пользуйтесь функциями. См. Пример 34-4.
Не пользуйтесь сложными конструкциями, если их можно заменить простыми.
COMMAND
if [ $? -eq 0 ]
...
# Избыточно и неинтуитивно.
if COMMAND
...
# Более понятно и коротко.
... читая исходные тексты сценариев на Bourne shell (/bin/sh). Я был потрясен тем, насколько непонятно и загадочно могут выглядеть очень простые алгоритмы из-за неправильного оформления кода. Я не раз спрашивал себя: "Неужели кто-то может гордиться таким кодом?"
Landon Noll
Глава 33. Разное
Практически никто не знает грамматики Bourne shell-а. Даже изучение исходных текстов не дает ее полного понимания.
Tom Duff
33.1. Интерактивный и неинтерактивный режим работы
В интеракивном режиме, оболочка читает команды, вводимые пользователем, с устройства tty. Кроме того, такая оболочка считывает конфигурационные файлы на запуске, выводит строку приглашения к вводу (prompt), и, по-умолчанию, разрешает управление заданиями. Пользователь имеет возможность взаимодействия с оболочкой.
Сценарий всегда запускается в неинтерактивном режиме. Но, не смотря на это, он сохраняет доступ к своему tty. И даже может эмулировать интерактивный режим работы.
#!/bin/bash
MY_PROMPT='$ '
while :
do
echo -n "$MY_PROMPT"
read line
eval "$line"
done
exit 0
# Этот сценарий, как иллюстрация к вышесказанному, предоставлен
# Stephane Chazelas (спасибо).
Будем считать интерактивным такой сценарий, который может принимать ввод от пользователя, обычно с помощью команды read (см. Пример 11-2). В "реальной жизни" все намного сложнее. Пока же, будем придерживаться предположения о том, что интерактивный сценарий ограничен рамками tty, с которого сценарий был запущен пользователемa, т.е консоль или окно xterm.
Сценарии начальной инициализации системы не являются интерактивными, поскольку они не предполагают вмешательство человека в процессе своей работы. Большая часть сценариев, выполняющих администрирование и обслуживание системы -- так же работают в неинтерактивном режиме. Многие задачи автоматизации труда администратора очень трудно представить себе без неинтерактивных сценариев.
Неинтерактивные сценарии прекрасно могут работать в фоне, в то время, как интерактивные -- подвисают, останавливаясь на операциях, ожидающих ввода пользователя. Сложности, возникающие с запуском интерактивных сценариев в фоновом режиме, могут быть преодолены с помощью expect-сценария или встроенного документа. В простейших случаях, можно организовать перенаправление ввода из файла в команду read (read variable <file). Эти приемы позволят создавать сценарии, которые смогут работать как в интерактивном, так и в неинтерактивном режимах.
Если внутри сценария необходимо проверить режим работы -- интерактивный или неинтерактивный, это можно сделать проверкой переменной окружения $PS1.
if [ -z $PS1 ] # интерактивный режим?
then
# неинтерактивный
...
else
# интерактивный
...
fi
Еще один способ -- проверка установки флага "i" в переменной $-.
case $- in
*i*) # интерактивный режим
;;
*) # неинтерактивный режим
;;
# (Из "UNIX F.A.Q.," 1993)
Сценарий может принудительно запускаться в интерактивном режиме, для этого необходимо указать ключ -i в строке-заголовке #!/bin/bash -i. Однако вы должны помнить о том, что в таких случаях сценарий может выдавать сообщения об ошибках даже тогда, когда ошибок, по сути, нет.
33.2. Сценарии-обертки
"Обертки" -- это сценарии, которые содержат один или несколько вызовов системных команд или утилит, с длинным списком параметров. Такой прием освобождает пользователя от необходимости вводить вручную сложные и длинные команды из командной строки. Он особенно полезен при работе с sed и awk.
Сценарии sed или awk, как правило вызываются в форме: sed -e 'commands' или awk 'commands'. "Заворачивая" такие вызовы в сценарий на языке командной оболочки, мы делаем их использование более простым для конечного пользователя. Кроме того, этот прием позволяет комбинировать вызовы sed и awk, например в конвейере, позволяя передавать данные с выхода одной утилиты на вход другой.
Пример 33-1. сценарий-обертка
#!/bin/bash
# Этот простой сценарий удаляет пустые строки из текстового файла.
# Проверка входных аргументов не производится.
#
# Однако вы можете дополнить сценарий такой проверкой,
# добавив нечто подобное:
# if [ -z "$1" ]
# then
# echo "Порядок использования: `basename $0` текстовый_файл"
# exit 65
# fi
# Для выполнения этих же действий,
# из командной строки можно набрать
# sed -e '/^$/d' filename
sed -e /^$/d "$1"
# '-e' -- означает команду "editing" (правка), за которой следуют необязательные параметры.
# '^' -- с начала строки, '$' -- до ее конца.
# Что соответствует строкам, которые не содержат символов между началом и концом строки,
#+ т.е. -- пустым строкам.
# 'd' -- команда "delete" (удалить).
# Использование кавычек дает возможность
#+ обрабатывать файлы, чьи имена содержат пробелы.
exit 0
Пример 33-2. Более сложный пример сценария-обертки
#!/bin/bash
# "subst", Сценарий замены по шаблону
# т.е., "subst Smith Jones letter.txt".

