Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_лаб_2_Unix_proc_2014.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
144.9 Кб
Скачать

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