Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Проверка условий и ветвление вычислительных процессов






Все команды UNIX вырабатывают код завершения (возврата), обычно для того, чтобы в дальнейшем можно было выполнить диагностику посредством проверки значения кода завершения и определить: нормально завершилось выполнение команды (=0 или true) или не нормально (# 0 или false). Например, если (=1), то ошибка синтаксическая.

Код завершения после выполнения каждой команды помещается автоматически в некоторую специальную системную переменную и ее значение можно вывести на экран:

echo $?

 

Пример:

$true

$echo $?

$ls

$echo $?

$false

$echo $?

$cp

< сообщение о некорректности заданной команды – нет параметров>

$echo $?

$echo $?

$

Код завершения используется для программирования условных переходов в sh-процедурах. Проверка истинности условий для последующего ветвления вычислительного процесса процедур может быть выполнена с помощью команды:

test < проверяемое отношение/условие>

Вместо мнемоники команды может использоваться конструкция c квадратными скобками:

[проверяемое отношение/условие] синоним команды test.

Аргументами этой команды могут быть имена файлов, числовые

или нечисловые строки (цепочки символов). Командой вырабатывается код завершения (код возврата), соответствующий закодированному в команде test условию. Код завершения проверяется следующей командой. Если закодированное параметрами условие выполняется, то вырабатывается логический результат (значение некоторой системной переменной) - true, если нет - false.

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

1. Проверка файлов:

test -к имя_файла

Ключи:

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

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

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

-f файл существует и имеет тип " -", т.е. обычный файл;

-s файл существует, имеет тип " -" и не пуст;

-d файл существует и имеет тип " d", т.е. файл - каталог.

2. Сравнение числовых значений:

test число1 –к число2

Числа могут быть как просто числовыми строками, так и переменными, которым эти строки присвоены в качестве значений.

Ключи для анализа числовых значений:

-eq равно; -ne не равно;

-lt меньше; -le меньше или равно;

-gt больше; -ge больше или равно.

Пример:

$x=5

$[$x -lt 7]

$echo $?

$[$x -gt 7]

$echo $?

$

3. Сравнение строк:

test [-n] 'строка' - строка не пуста (n – число проверяемых строк)

test -z 'строка' - строка пуста

test 'строка1' = 'строка2' - строки равны

test 'строка1'! = 'строка2' - строки не равны

Необходимо заметить, что все аргументы команды test - строки, имена, числа, ключи и знаки операций являются самостоятельными аргументами и должны разделяться пробелами.

Пример.

$x = abc

$[" $x" = " abc" ]

$echo $?

$[" $x"! = " abc" ]

$echo $?

$

ЗАМЕЧАНИЕ: выражение вида " $переменная" лучше заключать в двойные кавычки, что предотвращает в некоторых ситуациях возможную неподходящую замену переменных shell-ом.

Особенности сравнения чисел и строк. Shell трактует все аргументы как числа в случае, если осуществляется сравнение чисел, и все аргументы как строки, если осуществляется сравнение строк. Пример:

$X = 03

$Y =3

$[" $X -eq " $Y" ] сравниваются значения чисел

$echo $?

$[" $X = " $Y ] - числа сравниваются как строки символов

$echo $?

$

Ветвление вычислительного процесса в shell-процедурах осуществляется семантической конструкцией:

if список_команд1

then список_команд2

[else список_команд3

fi

 

Список_команд - это или одна команда или несколько команд, или фрагмент shell-процедуры. Если команды записаны на одной строке, то они разделяются точкой с запятой.

Для задания пустого списка команд следует использовать специальный оператор:

: (двоеточие) -пустой оператор.

Список_команд1 передает оператору if код завершения последней выполненной в нем команды. Если он равен 0, то выполняется список_команд2.Таким образом, код возврата 0 эквивалентен логическому значению " истина". В противном случае он эквивалентен логическому значению " ложь" и выполняется либо список_команд3 после конструкции else, либо - завершение конструкции if словом fi.

В качестве списка_команд1 могут использоваться списки любых команд. Однако, чаще других используется команда test.

В операторе if так же допускается две формы записи этой команды:

if test аргументы

if [ аргументы ]

Каждый оператор if произвольного уровня вложенности обязательно должен завершаться словом fi.

ЗАДАНИЕ: cоздать и выполнить файл с процедурой, сравнивающей передаваемый ей параметр с некоторым набором символов (паролем).

$ cat> com

if test 'param' = " $1" - сравниваются строки символов

then echo Y

else echo N

fi

< Ctrl*D>

$ chmod u+x com

$ com param

Y

$ com parm

N

$

ЗАДАНИЕ. Организовать ветвление вычислительного процесса в процедуре в зависимости от значения переменной Х (< 10, > 10, = 10).

if

[$X -lt 10]

then

echo X is less 10

else

if

[$X -gt 10]

then

echo X is greatr 10

else

echo X is equal to 10

fi

fi

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.