Командный интерпретатор shell может использоваться в качестве упрощенного языка программирования; в этом случае shell выступает не в роли оболочки, а в роли интерпретатора.
Программы, рассчитанные на выполнение при помощи shell, называются сценариями или скриптами и представляют собой текстовые файлы, состоящие из последовательностей команд. Сценарии могут использоваться пользователями для упрощения операций, состоящих из нескольких команд или включающих громоздкие параметры; таким образом, пользователь может фактически создавать собственные команды. Кроме того, сценарии активно используются в системе. Многие программы используют сценарии инициализации, автоматически выполняющиеся при запуске программы; оператор может скорректировать такой сценарий под конкретные задачи. Существуют и сценарии инициализации системы, которые выполняются при начальной загрузке операционной системы и отвечают за конфигурирование и запуск компонентов UNIX.
Сценарий может создаваться и редактироваться при помощи любого текстового редактора – vi, emacs, joe, текстовые редакторы графической среды и т.д. Чтобы обеспечить выполнение сценария, необходимо предварительно установить флаг исполнения (х) в маске прав файла – командой chmod или средствами любой визуальной оболочки.
В простейшем случае сценарий содержит набор команд в том виде, как они вводятся пользователем. Команды в таком сценарии выполняются последовательно в порядке записи. Текст сценария может содержать комментарии, начинающиеся символом «#»; комментарий может занимать всю строку или начинаться после команды. В первой строке часто указывается псевдо-комментарий, определяющий, какой интерпретатор следует запустить для исполнения скрипта – символы «#!» и полный путь к программе-интерпретатору. Поскольку различные shell несколько отличаются деталями синтаксиса скриптов, такое явное указание может оказаться необходимым.
Пример сценария:
#!/bin/bash
# Сценарий создает подкаталог files в домашнем
# каталоге запустившего его пользователя и
# копирует в него заданные файлы
mkdir ~/files
cp /usr/include/*.h ~/files
cp /usr/include/sys/*.h ~/files
Для каждого процесса в среде UNIX могут быть определены поименованные значения, называемые переменными окружения. Значениями переменных окружения являются цепочки символов (строки). Наиболее явным образом переменные окружения используются в shell-сценариях, где они выполняют роль переменных языка программирования.
Имена переменных начинаются с буквы и могут состоять из латинских букв, цифр и символов подчеркивания. Значения переменным присваиваются при помощи операции присваивания, обозначаемой символом «=»:
USERNAME=fred
Для подстановки значения переменной перед ее именем указывается символ $:
TMP_DIR=/var/tmp # Присваивается значение
mv *.tmp $TMP_DIR # перенос временных файлов в
# каталог /var/tmp
При выполнении сценария определены значения внутренних переменных командного интерпретатора:
Переменная |
Значение |
$0 |
Имя команды, которой запущен сценарий (имя файла) |
$1, $2,… |
Соответственно 1-й, 2-й и т.д. параметр командной строки |
$# |
Число параметров, введенных в командной строке |
$? |
Код завершения последнего выполненного процесса |
$$ |
PID текущего shell |
$! |
PID последнего процесса, запущенного в фоновом режиме |
$* |
Все параметры командной строки как единая строка |
Существует также набор переменных, используемых при запуске и выполнении программ. Важнейшие из них приведены в таблице 4.1
Таблица 4.1. Некоторые важнейшие переменные окружения
Переменная |
Значение |
PATH |
Каталоги, определенные как путь поиска программ (через двоеточие). Если в командной строке не указан полный путь к исполняемому файлу, система ищет указанное имя в каталогах, заданных переменной PATH |
LD_LIBRARY_PATH |
Каталоги, в которых следует искать загружаемые библиотеки. |
HOME |
Домашний каталог текущего пользователя |
TERM |
Тип терминала |
LOGNAME |
Имя текущего пользователя. |
Переменные определены до конца выполнения сценария, а также во всех процессах, запущенных непосредственно из него. Чтобы сделать переменные доступными другим процессам по окончании выполнения сценария, в shell Баурна используется конструкция export.
Рассмотрим фрагмент файла инициализации .profile для некоторого пользователя:
# К заданному системой пути поиска добавляются
# дополнительные каталоги - /sbin и /usr/sbin:
PATH=$PATH:/sbin:/usr/sbin
# исправленное значение переменной делается
# доступным после выхода из сценария (во всем
# сеансе пользователя):
export PATH
Команда set позволяет вывести на терминал значения всех установленных переменных. Кроме того, для вывода на терминал значений переменных активно используется команда echo.
Пример:
echo “Имя пользователя:“ $LOGNAME
echo “Домашний каталог:“ $HOME
В сценариях могут использоваться синтаксические конструкции условия, циклов и ветвления.
Условие.
if условие
then
команда1
команда2
...
fi
Пример:
# Проверка: если имя пользователя не равно root,
# выводится соответствующее сообщение
if [“$LOGNAME“ != “root“]
then
echo “Пользователь не обладает“
echo “привилегиями администратора“
fi
Циклы. shell Баурна содержит несколько операторов цикла:
1) Повторяется, пока выполняется условие:
while условие
do
команда1
команда2
...
done
2) Повторяется, пока условие не выполнится:
until условие
do
команда1
команда2
...
done
3) Повторяется для всех значений из списка; переменная принимает поочередно каждое из значений:
for переменная in список
do
команда1
команда2
...
done
Пример:
# Вывод на терминал первых трех параметров
# командной строки
for i in $1 $2 $3
do
echo $1
done
Ветвление. Значение сравнивается с шаблонами, начиная с первого. Если совпадение найдено, выполняются команды соответствующего раздела, до символов «;;». Если совпадения с другими шаблонами не произошло, то будут выполняться команды раздела «*)». Раздел «*)» может быть опущен.
case значение in
шаблон1)
команда
...
;;
шаблон1)
команда
...
;;
*)
команда
...
;;
esac
Пример:
#!/bin/sh
# В зависимости от значения первого параметра
# командной строки (start или stop) выполняются
# определенные действия. Если сценарий вызван
# с другим параметром или без параметров,
# выводится пояснительное сообщение
case $1 in
’start’)
# действия по запуску сервиса
...
;;
’stop’)
# действия по остановке сервиса
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.