
- •4. Основы программирования на командном языке (sh)
- •4.1. Переменные Shell
- •4.2. Присваивание значений переменным
- •4.3. Вывод содержимого переменных
- •4.4. Специальные символы
- •4.4.1. Кавычки
- •4.4.2. Двойные кавычки
- •4.7. Построим простейшую Shell-процедуру (командный файл)
- •4.8. Специальные параметры интерпретатора команд
- •4.9. Простые условные операторы
- •4.9.1. And-if (&&) – Условное и
- •4.9.2. Or-if (||) – Условное или
- •4.10. Команда test
- •4.10.1. Cравнение строк
- •4.10.2. Cравнение чисел
- •4.10.3. Проверка состояния файла
- •4.10.4. Использование команды test в операторе if
- •4.11. Управляющие конструкции высокого уровня
- •4.11.1. Условный оператор (if)
- •4.12. Операторы цикла (for и while)
- •4.12.1. Оператор цикла for
- •Пример_1: Процедура print1 печатает (выводит в стандартный вывод) три файла, перечисленные в списке значений цикла for.
- •4.12.2. Оператор цикла while
- •4.13. Оператор выбора case
- •4.14. Арифметические операции с переменными Shell
- •4.15 Стандартные переменные Shell
- •4.16 Экспортирование переменных
- •4.17 Встроенные команды интерпретатора sh
- •4.18. Системные файлы
- •4.19. Запуск и режимы работы sh
4.7. Построим простейшую Shell-процедуру (командный файл)
Пусть требуется перейти из домашнего каталога в каталог /bin, распечатать его содержимое и вернуться назад.
Последовательность команд, которая решает эту задачу, выглядит следующим образом:
%cd /bin
%ls –l | more
%cd
Запишем эту последовательность команд в файл с именем batch1.
Теперь можно вызвать интерпретатор командного языка Shell и передать ему в качестве аргумента имя командного файла:
%sh batch1
Unix позволяет сделать из текстового файла batch1 настоящую программу (команду). Для этого необходимо для файла batch1 установить в правах доступа разрешение на выполнение:
%chmod +x batch1
Теперь этот командный файл можно вызывать на выполнение так же, как и другие команды – по имени:
%batch1
Модифицируем командный файл batch1 так, чтобы можно было при вызове командного файла указывать имя каталога, оглавление которого необходимо распечатать, т.е. вызов командного файла должен выглядеть, например, так:
%batch 1 /bin
где аргумент /bin задает имя каталога.
Заменим имя каталога /bin в первой строке командного файла batch1 на позиционную переменную $1:
Позиционная переменная $1 является формальным параметром и интерпретатор командного языка заменит его на фактический параметр – имя каталога, заданное в качестве аргумента при вызове командной процедуры batch1.
В общем случае алгоритм обработки интерпретатором команд строк командной процедуры следующий:
интерпретатор читает очередную строку;
выявляет метасимволы и переменные;
производит необходимые замены и подстановки;
после этого интерпретатор вызывает исполняемый файл, имя которого совпадает с именем команды, и передает ему строку параметров.
4.8. Специальные параметры интерпретатора команд
Интерпретатор присваивает (автоматически) значения некоторым параметрам, обозначаемым одним из следующих символов:
# - количество позиционных параметров;
* - значения позиционных параметров в виде строки "$1 $2 $3 …";
@ - значения позиционных параметров;
$ - идентификатор текущего процесса (Shell-процесса);
? - десятичное значение, возвращаемое последней выполненной командой;
- - флаги, указанные при запуске Shell
! - идентификатор последнего запущенного процесса.
4.9. Простые условные операторы
4.9.1. And-if (&&) – Условное и
Формат этой конструкции следующий:
command1 && command2
Эта конструкция состоит из двух частей. Если первая команда выполнена успешно (код возврата “Истина”), только в этом случае выполняется вторая команда.
Пример:
%test -f .profile && cp .profile backup
1) первая команда (test -f .profile) проверяет, существует ли обычный файл .profile и, если такой файл существует, то выполняется вторая часть конструкции;
2) cp .profile backup – создаёт резервную версию файла backup.
Таким образом, вторая команда (команда копирования) выполняется в том случае, если команда test возвращает код «Истина», то есть основной файл (.profile) существует.
4.9.2. Or-if (||) – Условное или
Формат этой конструкции следующий:
command1 || command2
Вызывается команда command1 и проверяется её код возврата. Если command1 НЕ выполнилась (код её возврата будет не нулевым), то интерпретатор вызовет команду command2.
Пример:
%mkdir sample
Создается каталог sample.
%rmdir sample > /dev/null || echo failure
Каталог sample удаляется. Возможные сообщения команды rmdir перенаправляются на нуль-устройство. Вторая команда (echo failure) не выполняется.
%rmdir sample > /dev/null || echo failure
failure
Каталога sample уже нет. При выполнении команды rmdir получен код возврата False (Ложь). Поэтому выполняется команда echo, которая и выводит слово "failure" (ошибка).