Создание сценариев на языке оболочки shell

Сложная обработка текстов требует выполнения довольно длинных последовательностей команд. Поскольку ввод всех команд такой цепочки может занять достаточно много времени и чреват ошибками, в Unix существует понятие скрипта (сценария). Скрипт представляет собой любую последовательность команд, сохраненную в текстовом файле. Скрипт создается и редактируется средствами любого текстового редактора (команды ee,ed,red,vi,ex), также скрипт может создаваться программой или другим скриптом.

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

Как при интерактивной работе, так и при выполнении скриптов могут определяться и использоваться переменные, имеющие строковые значения. Имя переменной может быть последовательностью букв, цифр и знака подчеркивания, начинающейся с буквы или знака подчеркивания. Для присваивания значений переменным может использоваться оператор присваивания "=". При необходимости присвоить Shell-переменной значение, содержащее пробелы и другие специальные знаки, оно заключается в кавычки. Например:

var_1=13 # "13" - это не число, а строка из двух цифр.

 

var_2="ОС UNIX" # здесь двойные кавычки необходимы, так как в строке есть пробел.

Обратите внимание, что переменная и ее значение должны быть записаны без пробелов относительно символа "=".

Для получения значения переменной перед ее именем записывается символ ‘$’.

echo $var_1 # вывод значения переменной $var_1

Также значение переменной можно прочитать с клавиатуры:

read var_1

 

В скриптах можно также использовать значения параметров, с которыми был

вызван скрипт, они обозначаются от $1 до $9.

В последовательности символов те из них, которые составляют имя переменной, должны быть выделены в { } или " ". Кроме того, интерпретатор Shell автоматически присваивает значения пяти своим переменным:

    1. $? – код возврата последней выполненной команды;
    2. $$ - идентификационный номер процесса Shell;
    3. $! - идентификационный номер фонового процесса, запущенного интерпретатором Shell последним;
    4. $# - число аргументов, переданных в командной строке Shell;
    5. $- - флаги, переданные в Shell.

Как во всяком языке программирования в тексте на языке shell могут быть комментарии. Для этого используется символ "#". Все, что находится в строке (в командном файле) левее этого символа, воспринимается интерпретатором как комментарий. Если строка помещается в обратные кавычки, значит она является командой, которая будет выполнена, например:

now = `date` (где `` - обратные кавычки)

echo $now

Sun Feb 14 12:00:01 PST 1985

 

Структурные операторы shell

Shell, как и любой язык программирования, содержит набор операторов управления порядком выполнения команд, таких как if, case, while, until, for, break и некоторые другие. Логические выражения, используемые в операторах управления, строятся на основе кодов завершения команд, при этом специальная команда test позволяет проверить разнообразные условия, такие, как существование и тип указанного файла, равенство или неравенство строковых и числовых выражений и т.п.

Команда TEST

Команда test проверяет выполнение некоторого условия. С использованием этой встроенной команды формируются операторы выбора и цикла языка shell. Существует два возможных формата команды test:

test условие или [ условие ]

 

Если вы будете использовать второй вариант shell будет распознавать команду test по открывающей скобке "[", поэтому между скобками и содержащимся в них условием обязательно должны быть пробелы. Пробелы должны быть и между значениями и символом сравнения или операции. Не забывайте о противоположном требовании для операции присваивания значений переменным.

Имеется три типа проверок:

· оценка числовых значений;

· оценка типа файла;

· оценка строк.

Для чисел синтаксис следующий:

N op M, где N, M –числовые переменные, операция op принимает следующие значения:

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

Синтаксис для файла:

op filename, где операция op может принимать следующие значения:

-s файл существует и не пуст
-f обычный файл
-d файл является директорией
-w имеется право на запись
-r имеется право на чтение

Синтаксис для строк:

S op R, где операция op может принимать следующие значения:

= эквивалентность
!= неэквивалентность

op R, где операция op может принимать следующие значения:

-z строка пустая
-n строка непустая

 

Условный оператор IF

Синтаксис: Пример:

if <условие> echo -n “Введите код города ”

then <список команд> read z

[elif <условие> then <список команд>] if [ $z = 423 ]

[else <альтернативный список команд >] then echo “Владивосток“

fi elif [ $z = 495 ]

then echo “Москва“

elif [ $z = 815 ]

then echo “Мурманск“

else echo “Неверный код города”

fi

Несколько проверок могут быть объединены логическими операциями –a (and) и

-o (or).

Оператор выбора CASE

Синтаксис: Пример:

case <выражение> in echo -n “Введите код города ”

значение 1) < список команд> ;; read z

значение 2) < список команд> ;; case $z in

значение 3) и т.д. 423) echo Владивосток ;;

esac 495) echo Москва ;;

815) echo Мурманск ;;

*) echo “Неизвестный город ” ;;

esac

В конце каждой строки с альтернативным значением обязательно ставится ";;", так как в каждом случае может быть выполнено несколько команд. Если эти команды будут записаны в одну строку, то символ ";" будет использоваться как разделитель команд.

Обычно последняя строка выбора имеет шаблон *. Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой ")".

Оператор цикла FOR