Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Проверка условий и ветвление вычислительных процессов
Все команды 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.
|