Написание сценариев оболочки в Unix и Linux

Хотя все описанные выше команды и возможности, несомненно, полезны для повседневной работы с UNIX, истинная мощь этой операционной системы проявляется при наличии у пользователя способности создавать сценарии оболочки. В этом разделе мы приступим к разработке простой программы оболочки, что позволит приобрести знания и навыки в области ветвления, организации циклов и решения других задач.

Что собой представляет программа оболочки

Сценарием оболочки (или программой оболочки) называется файл, содержащий набор команд. Сценарий оболочки выглядит во многом так же, как и обычный файл UNIX,но содержит команды, которые могут выполняться оболочкой. Хотя здесь в основном будет рассказываться о написании программ для оболочки Korn, процесс написания программ для Bourne и C во многом похож. При желании сделать Korn оболочкой, используемой умолчанию, попросите администратора системы внести для вашей учетной записи соответствующие изменения в отвечающую за оболочку запись в файле /etc/passwd.

Прежде чем приступать к созданию программы оболочки, необходимо усвоить, что программы оболочки не содержат никаких специальных команд, которых нельзя было использовать в командной строке. Фактически любую команду из сценария оболочки можно вводить в командной строке и достигать того же самого результата. Все, что программа оболочки делает, так это избавляет от необходимости вводить одни и те же команды снова и снова всякий раз, когда требуется выполнить какой-то набор команд вместе. Кроме того, программы оболочки очень легко настраивать на регулярный запуск.

Использование переменных оболочки

О том, как переменные оболочки можно применять для настройки среды UNIX, уже рассказывалось в моем блоге. Их часто устанавливают внутри программы оболочки для того, чтобы они сохраняли свои значения на протяжении всего выполнения программы.

В случае запуска программы оболочки вручную переменные оболочки можно устанавливать непосредственно в используемом сеансе; тогда специфицировать их отдельно в программе оболочки нет никакой необходимости. Однако вручную программы оболочки запускаются редко, так как это сводит на нет саму цель применения таких программ.Чаще всего они запускаются в виде одного из заданий cron и потому могут запускаться и из такого сеанса, в котором не все переменные среды установлены правильным образом. За счет присваивания значений переменным оболочки внутри программы можно обеспечивать гарантию того, что при ее выполнении для таких ключевых переменных,как PATH, ORACLE_SID и ORACLE_HOME, будут использоваться корректные значения.

Вычисление выражений с помощью команды test

Для того чтобы писать хорошие сценарии оболочки, нужно обязательно разбираться в применении команды test. В большинстве сценариев используются условные операторы (наподобие if-then, while-do и until-do). Команда test помогает определять,удовлетворяется в таких операторах условие или нет.

В частности, команда test вычисляет выражение, и если условие оказывается истинным, возвращает значение 0, а если нет — тогда значение больше нуля (обычно 1).

Синтаксис команды test выглядит следующим образом:

test выражение 

Она может использоваться как сама по себе, так и вместе с конструкциями if, while или until для вычисления любого выражения. Ниже приведен пример:

$ test "ONE" = "one" 

Этот оператор просит команду test определить, являются ли строки “ONE” и “one” одинаковыми.

Команду test можно применять неявно (через псевдоним), указывая вместо слова test квадратные скобки:

$ [ "ONE" = "one" ] 

Для выяснения того, истинным или ложным у команды test (или ее эквивалента с квадратными скобками) получилось выражение "ONE" = "one", следует помнить о том,что если результирующий код (код завершения) равен 0, выражение считается истинным, а в противном случае, соответственно, ложным. Чтобы отобразить результирующий код, достаточно воспользоваться специальной переменной $?, которая показывает код завершения для любой команды UNIX или Linux. В нашем случае код завершения будет выглядеть так:

$ test "ONE" = "one"
$ echo $?
0

Коды завершения могут применяться в сценариях оболочки для проверки состояния выполнения любой из используемых в них команд.

При сравнении целых чисел вместе с командой test можно также применять следующие операции отношения:

-ne: не равно
-eq: равно
-lt: меньше
-gt: больше
-ge: больше или равно
-le: меньше или равно 

Запуск программ оболочки с аргументами командной строки

Для спецификации параметров программ оболочки часто используются аргументы командной строки. Например, программа example.ksh может быть запущена следующим образом:

$ example.ksh prod1 system

В данном случае example.ksh — это имя файла, в котором находится сценарий оболочки, а prod1 и system — аргументы командной строки, указывающие, соответственно, на имя базы данных и имя пользователя в этой базе данных. Внутри сценария оболочки есть два аргумента $1 и $2, которые соответствуют prod1 и system.

В UNIX используется позиционная система, означающая, что первый аргумент после имени сценария оболочки является значением переменной $1, второй — значением переменной $2 и т.д. То есть под каждой встречающейся внутри сценария ссылкой на переменную $1 подразумевается, что данная переменная ссылается на первый аргумент (каковым в приведенном примере является имя базы данных prod1).

За счет применения аргументов командной строки сценарий можно использовать повторно для нескольких различных комбинаций имени базы данных и имени пользователя, без внесения в него изменений

Анализ сценария оболочки

Давайте рассмотрим простой, предназначенный для наблюдения за базой данных сценарий оболочки по имени example.ksh. Этот сценарий выполняет проверку на предмет наличия определенного файла и уведомляет, если ему не удается его отыскать.В нем используется один аргумент командной строки для указания имени базы данных,а это значит, что в нем должна присутствовать переменная $1.

При создании программы оболочки UNIX никак не может знать, что эта программа является исполняемой. Для уведомления UNIX о том, что программа представляет собой исполняемый сценарий оболочки, применяется команда chmod

$ ll example.ksh
-rw-rw-rw- 1 salapati dba 439 feb 02 16:51 example.ksh
$ chmod 766 example.ksh
$ ll example.ksh
4-rwxrw-rw- 1 salapati dba 439 feb 02 16:52 example.ksh
$

Здесь можно увидеть, что при первоначальном создании сценарий не был исполняемым, поскольку не предусматривал ни для кого прав на выполнение. За счет применения команды chmod разрешение на выполнение этого сценария было предоставлено его владельцу (salapati) и после этого он стал исполняемым.

Ниже приведено содержимое сценария оболочки example.ksh, предусматривающее выполнение проверки на предмет наличия в каталоге определенного файла и отправку соответствующего электронного сообщения администратору баз данных в случае, если его там не окажется: 

#!/bin/ksh
ORACLE_SID=$1 export ORACLE_SID
PATH=/usr/bin:/usr/local/bin:/usr/contrib./bin:$PATH
export PATH
ORACLE_BASE=${ORACLE_HOME}/../..;
export ORACLE_BASE
export CURRDATE='date +%m%dY_%H%M'
export LOGFILE=/tmp/dba/dba.log
test -s $ORACLE_HOME/dbs/test${ORACLE_SID}.dbf
if [ 'echo $?' -ne 0 ]
then
echo "Файл не найден!"
mailx -s "Критическая ошибка: тестовый файл не найден!" Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. < $LOGFILE
fi

Теперь вкратце проанализируем содержимое сценария. В первой строке объявляется о том, что данная программа будет использовать оболочку Korn — именно это и обозначает самая верхняя строка #!/bin/ksh. Такая строка является стандартной для программ, предназначенных для оболочки Korn (и выглядит примерно так же и в программах, предназначенных для других оболочек).

В следующей строке мы видим, что переменной среды ORACLE_SID назначается значение переменной $1. Это значит, что во время выполнения программы оболочки переменной $1 будет присваиваться значение первого передаваемого параметра и что именно оно и будет устанавливаться для переменной среды ORACLE_SID. Еще в этой строке выполняется экспорт значения для переменной среды ORACLE_BASE.

Далее в программе экспортируются значения для трех переменных среды — PATH,CURRDATE и LOGFILE. Затем в сценарии используется команда тестирования файла,test, для выполнения проверки на предмет существования в конкретном месте файла testprod1.dbf (где prod1 соответствует значению ORACLE_SID). В UNIX успешное выполнение команды обозначается значением 0, а неудачное — значением 1; еще нужно вспомнить о том, что echo $?variable_name будет приводить к выводу значения переменной на экран. Исходя из этого, идущая далее строка, if [ 'echo $? ' -ne 0], дословно означает: “если результат выполнения команды test негативный” (или, другими словами, “если файл не существует”). Потом идет оператор then, который в случае,если данное условие истинно (файл не существует), будет заносить в журнальный файл сообщение “Файл не найден!”, а также с помощью программы mail отправлять администратору баз данных электронное сообщение о том, что требуемый файл отсутствует.Программа mail позволяет отправлять электронные сообщения как на личный электронный адрес человека, так и на адрес учетных записей пользователей, находящихся на другом сервере UNIX.

Все, что необходимо сделать, чтобы запустить или выполнить этот сценарий оболочки — ввести его имя в командной строке и указать после него имя интересующей базы данных. Чтобы этот метод сработал, однако, при запуске сценария нужно обязательно находиться в оболочке Korn.

Теперь, когда мы рассмотрели, как создается простой сценарий, давайте перейдем к изучению более мощных и при этом все равно легких приемов, позволяющих писать более сложные программы оболочки.

Вас заинтересует / Intresting for you:

Что собой представляет оболочк...
Что собой представляет оболочк... 1462 просмотров Семен Tue, 21 Nov 2017, 13:19:25
Получение справочной информаци...
Получение справочной информаци... 1877 просмотров Алексей Вятский Tue, 21 Nov 2017, 13:19:25
Просмотр команд SQL с помощью ...
Просмотр команд SQL с помощью ... 2323 просмотров Ольга Потемкина Tue, 21 Nov 2017, 13:18:46
Ввод SQL-инструкций в SQL*Plus
Ввод SQL-инструкций в SQL*Plus 7757 просмотров Александров Попков Wed, 14 Mar 2018, 05:39:02
Печать
Войдите чтобы комментировать

ildergun аватар
ildergun ответил в теме #10182 2 года 4 мес. назад
Согласен с Apv. Благодарю автора за статью - хорошее подспорье для новичка!
apv аватар
apv ответил в теме #8403 6 года 11 мес. назад
Любой стоящий админ баз данных Oracle и Mysql должен уметь писать сценарии/скрипты под Linux/Unix. Резервирование, проверка и куча других задач.