
- •«Разработка командных процедур в ос Unix»
- •1. Цель лабораторной работы
- •2. Интерпретаторы команд ос Unix
- •3. Основные реализации командных интерпретаторов
- •4. Аргументы командных процедур
- •5. Простейшая командная процедура (командный файл)
- •6. Специальные параметры интерпретатора команд
- •7. Команда test
- •7.1. Cравнение строк
- •7.2. Cравнение чисел
- •7.3. Проверка состояния файла
- •8. Управляющие конструкции высокого уровня
- •8.1. Условный оператор (if)
- •8.2. Операторы цикла (for и while)
- •8.2.1. Оператор цикла for
- •8.2.2. Оператор цикла while
- •8.3. Оператор выбора case
- •8.4. Арифметические операции с переменными Shell
- •8.5 Стандартные переменные Shell
- •Задание по лабораторной работе:
- •Отчет о работе
- •Литература
- •Оглавление
7.3. Проверка состояния файла
В случае использования команды test для проверки состояния файла <выражение> может состоять из следующих примитивов:
-r файл - истина, если файл существует и доступен для чтения;
-w файл - истина, если файл существует и доступен для записи;
-x файл - истина, если файл существует и доступен для выполнения;
-f файл - истина, если файл существует и является обычным файлом;
-d файл - истина, если файл существует и является каталогом;
-c файл - истина, если файл существует и является специальным символьно-ориентированным файлом;
-b файл - истина, если файл существует и является специальным блок-ориентированным файлом.
8. Управляющие конструкции высокого уровня
8.1. Условный оператор (if)
Формат простого оператора if:
if условие
then
команда
команда
. . . . . . .
fi
Если условие истинно (True), то команды, которые находятся между служебными словами then и fi будут исполнены, в противном случае они будут пропущены.
Примечание. (Использование команды test в операторе if).
Команда test часто используется в составе условного оператора в командных процедурах.
if test "`date + %d`" -eq 24
then
echo OK
fi
Условие представляет собой выражение, которое может быть заключено в квадратные скобки:
[условное_выражение]
Кроме того, в выражении могут применяться операторы –a (AND) и –o (OR):
[$i –gt 7 –a $i –le 99]
По сути, мы использовали команду test, однако применение квадратных скобок позволяет не указывать имени команды.
Приведенное выражение будет верно только в том случае, если переменная i > 7 и i ≤ 99.
Формат расширенного оператора if:
if условие
then
команда
команда
. . . . . . .
else
команда
команда
. . . . . . .
fi
else
команда
команда
. . . . . . .
fi
Пример_1: Командная процедура (назовём её who2), выводящая сведения о работе в данный момент одного из зарегистрированных в системе пользователей.
if
who | grep "$1" > /dev/null
then
echo "$1 is logged on"
else
echo "$1 is not logged on"
fi
Запуск командной процедуры предполагает задание имени пользователя в качестве параметра:
% who2 petrov
Если пользователь petrov работает в системе в момент запуска процедуры who2, то будет выведено сообщение:
petrov is logged on (Петров зарегистрировался в системе)
в противном случае будет выведено сообщение:
petrov is not logged on (Петров не зарегистрировался системе)
В качестве условия в команде if используется конвейер из двух команд:
who - выводит в стандартный вывод сведения о работающих в настоящее время пользователях с указанием времени входа в систему;
grep – пропускает на выход только те строки из вывода команды who, в которых встречается заданный в качестве формального параметра $1 имени пользователя.
8.2. Операторы цикла (for и while)
Все языки программирования включают механизм, который позволяет многократно повторять группу операторов.
8.2.1. Оператор цикла for
Формат оператора цикла for:
for переменная in список
do
команда
команда
. . . . . . .
done
Список команд, заключенный между ключевыми словами do . . . done выполняется один раз для каждого значения из списка. При этом очередное выбираемое значение из списка присваивается переменной, имя которой указано слева от ключевого слова in.
Список значений может задаваться символьными константами и значением некоторой переменной, содержащей последовательность, разбиваемую разделителями.
Пример_1: Процедура print1 печатает (выводит в стандартный вывод) три файла, перечисленные в списке значений цикла for.
for file
in otchet pismo spravka
do
echo "printing $file"
more "$file"
done
Пример_2: Процедура print2 печатает файлы, перечисленные в командной строке (%print2 spravka otchet). В списке значений цикла for использована переменная '*' (см. раздел 6), содержащая список позиционных параметров, т.е. имена файлов spravka и otchet.
for file
in $*
do
echo "printing $file"
more "$file"
done
Пример_3: Процедура print3 печатает файлы, список которых получен командой ls.
for file
in `ls`
do
echo "printing $file"
more "$file"
done