Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
#!/bin/sh
• name: backfunc
• конфигурационный файл содержит настройки по умолчанию для систем архивации _CODE="comet"
_FULLBACKUP="yes" _LOGF1LE="/logs/backup/" _DEVICE="/dev/rmt/0n" _INFORM="yes" _PRINT_STATS="yes"
Комментарии разъясняют суть программы. Первое поле, _code, содержит кодовое слово. Для просмотра его содержимого и изменения значений пользователь должен ввести код, соответствующий значению code. В данном случае указывается слово "comet".
Ниже приведен сценарий, который в ответ на ввод пароля отображает конфигурацию, заданную по умолчанию:
$ pg readfunc
#!/bin/sh
# readfunc
if [ -r backfunc ]; then
# указание файла с параметрами
. /backfunc else
echo "`basename $0` cannot locate backfunc file" fi
echo -n "Enter the code name :"
# соответствует ли указанный код коду из файла backfunc?
if [ "${CODE}" != "${_CODE}" ]; then
echo "Wrong code…exiting..will use defaults" exit 1 fi
echo ." The environment config file reports"
echo "Full Backup Required : $_FULLBACKUP"
echo "The Logfile is : $_LOGFILE"
echo "The Device To Backup To is : $_DEVICE" echo "You Are To Be Informed by Mail : $_INFORM" echo "A Statistic Report To Be Printed: $_PRINT_STATS"
После запуска сценария на выполнение отобразится запрос на ввод кода. Если введенный код соответствует заданному кодовому слову, можно будет просмотреть настройки, заданные по умолчанию. Рабочий вариант сценария предоставит возможности для изменения настроек, заданных по умолчанию.
$ readfunc
Enter the code name :comet
The environment config file reports
Full Backup Required : yes
The Logfile ls : /logs/backup/
The Device To Backup To ls : /dev/rmt/0n You Are To Be Informed by Mail : yes A Statistic Report To Be Printed: yes
19.13. Заключение
Применение функций позволяет сэкономить массу времени, затрачиваемого на разработку сценариев. Благодаря созданию универсальных и многократно используемых функций отпадает необходимость в технической поддержке разработанных сценариев, использующих эти функции.
После разработки набора требуемых функций необходимо разместить их в файле функций. В результате этого функциями смогут воспользоваться другие сценарии.
ГЛАВА 20
Передача параметров сценарию
В предыдущих главах рассматривались способы передачи параметров сценариям с помощью специальных переменных $1...$9. Специальная переменная $# указывает количество передаваемых параметров. Также обсуждалась конструкция usage. Эта конструкция применяется для информирования пользователя о том, как вызвать сценарий или функцию с помощью соответствующих параметров вызова. В этой главе будут рассмотрены следующие темы:
• применение команды shift;
• работа с командой getopts;
• примеры использования команд shift и getopts.
Для проверки степени усвоения материала рассмотрим схему сценария, в котором используются параметры start и stop. При запуске сценария необходимо указать два параметра. Если они не заданы, отображается предупреждающее сообщение. Обратите внимание, что для обработки различных параметров, передаваемых сценарию, применяется конструкция case.
$ pg opt
#!/bin/sh
# opt
usage ()
{
echo "usage:`basename $0` start|stop process name"
}
OPT=$1
PR0CESSID=$1
#if [ $# -ne 2 ]
then
usage
exit 1 fi
case $OPT in
start|Start) echo "Starting..$PROCESSID"
# выполняется некоторая обработка
;;
stop|Stop) echo "Stopping..$PROCESSID" # выполняется некоторая обработка
;;
*) usage
;;
esac
Приведенный сценарий при вводе данных выдает такие результаты:
$ opt start named
Starting…named
$ opt start
usage:opt start|stop process name
Общий формат произвольной команды UNIX или Linux: команда опции файлы
Часть опции может принимать до 12 различных значений. Как показано в примере со сценарием opt, для работы с командными опциями следует создавать большой объем программного кода. В данном случае мы имеем дело лишь с двумя опциями, start и stop.
К счастью, интерпретатор команд поддерживает команду shift, с помощью которой можно выбирать различные опции. Команда shift позволяет устранить ограничение, состоящее в том, что при передаче параметров применяются только специальные переменные $1…$9.
20.1. Команда shift
При передаче сценарию параметров потребуется соответствующий метод обработки, использующий возможности команды shift. В результате выполнения этой команды позиционные аргументы смещаются влево на один элемент. Чтобы уточнить принцип действия команды shift, рассмотрим простой сценарий. Здесь применяется цикл while, обеспечивающий отображение на экране всех аргументов, переданных сценарию.
$ pg opt2
#!/bin/sh
# opt2
loop=0
while [ $# -ne 0 ] # цикл выполняется до тех пор, пока остаются аргументы
do
echo $1 done
Создается впечатление, что указанный сценарий будет выполняться до тех пор, пока в командной строке не останется аргументов. К сожалению, это не так. При запуске сценария на экран выводится только первый аргумент, поскольку в сценарии не предусмотрен переход к следующему параметру. Вот результат выполнения вышеприведенного сценария:
$ opt2 файл1 файл2 файлЗ
файл1 файл1 файл1
20.1.1. Простой способ использования команды shift
Для обработки каждого передаваемого аргумента достаточно воспользоваться командой shift. Ниже приводится соответствующий сценарий:
$ pg opt2
#!/bin/sh
# oPt2
1оор=0
while [ $# -ne 0 ] # цикл выполняется до тех пор, пока остаются аргументы do
echo $1
shift
done
Теперь, при выполнении этого сценария можно получить более приемлемый результат:
$ opt2 файл1 файл2 файл3
файл1 файл2 файл3
20.1.2. Последний параметр командной строки
Несмотря на то что команда eval еще не обсуждалась, можно воспользоваться ею, если требуется уточнить последний параметр командной строки (обычно в качестве этого параметра используется имя файла). Получить последний параметр командной строки вы можете двумя способами. Во–neрвых, с помощью команды eval echo $$#, а во–вторых, путем применения команды shift `expr $# - 2`.
20.1.3. Преобразования файла с помощью команды shift
Использование возможностей команды shift значительно облегчает работу с опциями командной строки. Рассмотрим сценарий, выполняющий преобразование регистра символов. При этом будет применяться команда tr.
При выполнении сценария используются две опции:
-l для нижнего регистра -u для верхнего регистра
С помощью команды shift можно запустить на выполнение сценарий, работающий с опциями -l и -u. Ниже приводится первый вариант этого сценария.
$ pg tr_case
#!/bin/sh
#tr_case
#преобразование регистра usage ()
{
# сообщение usage
echo "usage:`basename $0` -[l|u] file [files]" >&2
exit 1
}
if [ $# -eq 0 ]; then
# параметры не переданы!
usage
fi
while [ $# -gt 0 ]
do
case $1 in
-u|-U) echo " -uoption specified"