Пользовательская среда UNIX: командный процессор shell и графическая система X Window (4 глава дипломной работы), страница 2

            Командный интерпретатор 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’)

          # действия по остановке сервиса