![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Построение циклов ⇐ ПредыдущаяСтр 6 из 6
Циклы обеспечивают многократное выполнение отдельных участков процедуры до достижения заданных условий. Цикл типа while (пока true): while список_команд1 do список_команд2 done Список_команд1 возвращает код возврата последней выполненной команды. Если условие истинно, выполняется список_- команд2, затем снова список_команд1 с целью проверки условия, а если ложно, выполнение цикла завершается. Таким образом, циклический список_команд2 выполняется до тех пор, пока условие истинно. Пример 1. Проверка наличия параметров при обращении к данной процедуре. Вывод на экран сообщений о наличии параметров и тексты параметров. Текст процедуры, которой присвоено имя Р1: if $1 –eq 0 then echo “No param” else echo “Param: ’; while test ‘$1’ do echo “$1” shift done fi Результат работы процедуры: $P1 No param $P1 abc df egh Param: abc df egh $
Пример 2. Ввод строки из нескольких слов. Подсчет и вывод числа символов в каждом слове. Текст процедуры, которой присвоено имя P2: echo “Input string: ” read A set $A while [ “$1” ] do echo “$1 = `expr ”$1”: ‘.*’`” shift done Результат работы процедуры: $P2 Input string: df ghghhhh aqw df = 2 ghghhhh = 7 aqw = 3 $ Пример 3. Вывести на экран слово строки (поле), номер которого (переменная N) указан в параметре при обращении к процедуре, которой присвоено имя P3. Процедура запрашивает ввод строки с клавиатуры. Номер слова вводится как аргумент процедуры. Текст процедуры P3: i=1 - счетчик номеров слов в строке, формируется при каждом выполнении цикла N=$1 -значение первого параметра echo " Введи строку: " read a set $a while test $i -lt $N do i=`expr $i + 1` - формирование номера следующего слова shift done echo " $N поле строки: \" $1\" "
Пример работы процедуры P3: $P3 2 < NewLine> - N=2 Введи строку: aa bb cc dd < NewLine> 2 поле строки: " bb" $ Цикл типа until (пока false): until список_команд1 do список_команд2 done Логическое условие, определяемое по коду возврата списка_команд1, инвертируется, т.е. цикл выполняется до тех пор, пока условие ложно. Пример процендуры с именем P4, выполняющей заданное число циклов. $cat> P4 X = 1 - cчетчик числа циклов until test $X -gt 10 - задано число циклов = 10 do echo X is $X X = `expr $X + 1` done < Ctrl*D> $sh P4 X is 1 X is 2 ................. X is 10 $
Цикл типа for: for имя_ переменной [in список_значений] do список_команд done Переменная с указанным в команде именем заводится автоматически. Переменной присваивается значение очередного слова из списка_значений и для этого значения выполняется список_команд. Количество итераций равно количеству значений в списке, разделенных пробелами (т.е. циклы выполняются пока список не будет исчерпан). Пример текста процедуры, печатающей в столбец список имен файлов текущего каталога. list =`ls` for val in $list do echo " $val" done echo end Пример процедуры, которая должна скопировать все обычные файлы из текущего каталога в каталог, который задается в качестве аргумента при обращении к данной процедуре по имени comfil. Процедура проверяет так же наличие каталога-адресата и сообщает количество скопированных файлов.
m=0 - переменная для счетчика скопированных файлов if [ -d $HOME/$1 ] then echo " Каталог $1 существует" else mkdir $HOME/$1. echo " Каталог $1 создан" fi for file in * do if [ -f " $file" ] then cp " $file" $HOME/$1; m=`expr $m + 1` fi done echo " Число скопированных файлов: $m" Выполнение процедуры: $sh comfil dir1 Число скопированных файлов: …. Здесь символ * - имеет смысл < список_имен_файлов_текущего_ каталога> Пример процедуры PROC, выводящей на экран имена файлов из текущего каталога, число символов в имени которых не превышает заданного параметром числа. if [ “$1” = “” ] then exit fi for nam in * do size = `expr $nam: ‘.*’` if [ “$size” –le “$1” ] then echo “Длина имени $nam $size символа” fi done Вывод содержимого текущего каталога для проверки работы процедуры: $ ls –l total 4 drwxrwxrwx 2 lev lev 1024 Feb 7 18: 18 dir1 -rw-rw-r-- 1 lev lev 755 Feb 7 18: 24 out -rwxr-xr-x 1 lev lev 115 Feb 7 17: 55 f1 -rwxr-xr-x 1 lev lev 96 Feb 7 18: 00 f2 $ Результаты работы процедуры: $ PROC 2 Длина имени f1 2 символа Длина имени f2 2 символа $PROC 3 Длина имени out 3 символа Длина имени f1 2 символа Длина имени f2 2 символа $
Пример. Процедура с итменем PR выводит на экран из указанного параметром подкаталога имена файлов с указанием их типа. cd $1 for fil in * do If [ -d $fil] then echo “$fil – catalog” else echo “$fil – file” fi done Вывод содержимого подкаталога для проверки работы процедуры: $ ls –l pdir total 4 drwxrwxrwx 2 lev lev 1024 Feb 7 18: 18 dir1 -rw-rw-r-- 1 lev lev 755 Feb 7 18: 24 out -rwxr-xr-x 1 lev lev 115 Feb 7 17: 55 f1 -rwxr-xr-x 1 lev lev 96 Feb 7 18: 00 f2
Результаты работы процедуры: $ PR pdir dir1 – catalog out – file f1 – file f2 – file $ Некоторые дополнительные команды, которые могут быть использованы в процедурах: sleep t - приостанавливает выполнение процесса на t секунд Пример. Бесконечная (циклическая) процедура выводит каждые пять секунд сообщение в указанный файл fil. while true do echo “текст_сообщения”> fil sleep 5 done Примечание: вместо файла (или экрана) может быть использовано фиктивное устройство /dev/null (например для отладки процедуры). Примечание: в процедуре реализуется бесконечный цикл. Для ограничения числа циклов надо предусмотреть счетчик циклов (см. выше) или пркратить выполнение процесса процедуры с помощью команды управления процессами - $kill (см. ниже). exit [n] - прекращение выполнения процедуры с кодом завершения [n] или с кодом завершения последней выполненной команды. В качестве “n” можно использовать любое число, например, для идентификации выхода из сложной процедуры, имеющей несколько причин завершения выполнения.
|