Создание сценариев на языке оболочки 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 автоматически присваивает значения пяти своим переменным:
- $? – код возврата последней выполненной команды;
- $$ - идентификационный номер процесса Shell;
- $! - идентификационный номер фонового процесса, запущенного интерпретатором Shell последним;
- $# - число аргументов, переданных в командной строке Shell;
- $- - флаги, переданные в 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