Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционная система UNIX.doc
Скачиваний:
94
Добавлен:
01.05.2014
Размер:
1.67 Mб
Скачать

9.3.6. Использование /dev/null

Файловая система имеет файл /dev/null, где вы можете хранить нежелательный вывод. Например, если просто ввести команду who, то система ответит, кто работает в системе. Если вы перенаправите вывод этой команды в /dev/null:

who > /dev/null

то не получите ответа.

9.3.7. Условные операторы

Оператор if ... then

Команда if говорит shell программе, что нужно выполнить последовательность команд после then, если последняя команда в списке команд конструкции if выполнилась успешно. Конструкции if заканчиваются ключевым словом fi.

Общий формат конструкции if:

if<CR>

command_1<CR>

.

.

.

last command<CR>

then<CR>

command_1<CR>

.

.

.

last command<CR>

fi<CR>

Например, shell программа search демонстрирует применение конструкции if ... then. Программа search использует команду grep для поиска слова в файле. Если grep выполнилась успешно, то программа отображает найденное слово. Экран будет выглядеть следующим образом:

$ cat search<CR>

echo Type in the word and the file name.

read word file

if grep $word $file

then echo $word is in $file

fi

$

Эта программа отображает вывод команды grep. Если вы хотите сохранить ответ системы на команду grep в вашей программе, то воспользуйтесь файлом /dev/null, изменив командную строку if на следующую:

if grep $word $file > /dev/null<CR>

Теперь выполните команду search. Она ответит только сообщением, указанным после команды echo.

Конструкция if ... then ... else может исполнять альтернативный набор команд, стоящий после else, в случае, если последовательность if является ложью. Формат этой конструкции следующий:

if<CR>

command_1<CR>

.

.

.

last command<CR>

.linthen<CR>

command_1<CR>

.

.

.

last command<CR>

else<CR>

command_1<CR>

.

.

.

last command<CR>

fi<CR>

С помощью этой конструкции вы можете усовершенствовать программу search, так что она будет сообщать вам и найденное слово и то, что слово не найдено. В этом случае программа search будет выглядеть следующим образом:

$ cat search<CR>

echo Type in the word and the file name.

read word file

if

grep $word $file > /dev/null

then

echo $word is in $file

else

echo $word is NOT in $file

fi

$

Команда test

Команда test используется для организации цикла. Она проверяет на истинность определенные условия и полезна для организации условных конструкций. Если условие истинно, то цикл будет продолжен. Если условие ложно, то цикл завершится и будет выполняться следующая команда. Некоторые примеры использования команды test:

test -r file<CR>

истина, если файл существует и доступен для чтения;

test -w file<CR>

истина, если файл существует и доступен для записи;

test -x file<CR>

истина, если файл существует и является выполняемым;

test -s file<CR>

истина, если файл существует и имеет как минимум один символ;

test var1 -eq var2<CR>

истина, если var1 равно var2;

test var1 -ne var2<CR>

истина, если var1 не равно var2.

Пример. Создадим shell программу, которая перемещает все исполняемые файлы из текущего справочника в ваш справочник bin. Для этого воспользуемся командой test -x для выбора исполняемых файлов. Программа mv.file будет выглядеть следующим образом:

$ cat mv.file<CR>

echo type in the directory path

read path

for file

do

if test -x $file

then

mv $file $path/$file

fi

done

$

Конструкция case ... esac позволяет выбрать вам один из несколько шаблонов и затем выполнить список команд для этого шаблона. Выражение-шаблон должно начинаться с ключевого слова in, а правая круглая скобка должна быть помещена после последнего символа каждого шаблона. Последовательность команд для каждого шаблона заканчивается двумя знаками ;;. Конструкция case должна быть закончена ключевым словом esac.

Общий формат конструкции case:

case word<CR>

in<CR>

pattern1)<CR>

command line 1<CR>

.

.

.

last command line<CR>

;;<CR>

pattern2)<CR>

command line 1<CR>

.

.

last command line<CR>

;;<CR>

pattern3)<CR>

command line 1<CR>

.

.

last command line<CR>

;;<CR>

*)<CR>

command line 1<CR>

.

.

last command line<CR>

;;<CR>

esac<CR>

Конструкция case пытается найти word с шаблоном pattern в первой секции шаблонов. Если поиск удачен, то программа выполняет командные строки после первого шаблона до соответствующих знаков ;;.

Если первый шаблон не найден, то осуществляется переход ко второму шаблону. Если любой шаблон найден, то программа не рассматривает остальные шаблоны, а переходит к команде, следующей за esac. Знак * используется как шаблон для поиска любого word и таким образом дает вам набор команд, который будет выполнен, если никакой другой шаблон не будет найден. Поэтому шаблон звездочка (*) размещается как последний шаблон в конструкции case, чтобы другие шаблоны были проверены первыми. Это поможет вам обнаружить некорректный и неожиданный ввод.

В шаблонах могут использоваться метасимволы *, ?, []. Это обеспечивает гибкость программ.

Рассмотрим пример. Программа set.term устанавливает переменную TERM в соответствии с типом терминала, который вы используете. Применяется следующая командная строка:

TERM=terminal_name<CR>

Шаблон * стоит последним в списке шаблонов. Он выдает предупреждающее сообщение, что для указанного типа терминала нет соответствующего шаблона и позволяет вам завершить конструкцию case.

Пример.

$ cat set.term<CR>

echo If you have a TTY 4420 type in 4420

echo If you have a TTY 5410 type in 5410

echo If you have a TTY 5420 type in 5420

read term

case term

in

4420)

TERM-T4

;;

5410)

TERM-T5

;;

5420)

TERM-T7

;;

*)

echo not a correcr terminal type

;;

esac

export TERM

echo end of programm

$

Соседние файлы в предмете Операционные системы