русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Нет такой фирмы


Дата добавления: 2014-11-27; просмотров: 553; Нарушение авторских прав


Холдинг: Not-Net

 


Еще пример.

###

# subdir: Выдает имена всехподдиректориев

# директория с именем $dir
for i in $dir/*
do
if [ -d $i ]

then echo $i
fi

done

Следующий расчет иллюстрирует полезный, хотя и с долей
трюкачества, способ повторения одних и тех же действий
несколько раз. Переменная "i" принимает здесь пять значений: 1,
2, 3, 4, 5, но внутри цикла эта переменная отсутствует и поэтому
ее значение никакой роли не играет и ни чего не меняет. С таким
же успехом переменная "i" могла принимать значения, скажем ф о к у с, а в результате точно также было бы пять раз повторено
одно и то же вычисление содержимого цикла без изменений.

###

#print-5: Организации пятикратного выполнения
команды

for i in 1 2 3 4 5
do

cat file-22 > /dev/lp
done

Расчет "print-n" иллюстрирует еще одну полезную
возможность в использовании цикла "for". Здесь, после "for i...",
отсутствуют "in ..." и перечень имен, т.е. перечнем имен для "i"
становится перечень параметров, а следовательно количество
печатаемых экземпляров можно менять.

###

# print-n: Задание числа копий

# через параметры
for i
do

cat file-22 > /dev/lp
done

Смысл не изменится, если первую строку расчета записать
как


for i in $*

поскольку значение "$*" - есть список значений параметров.
Отметим различие в специальных переменных "$*" и "$@",
представляющих перечень параметров. Первый представляет
параметры, как строку, а второй, как совокупность слов.
Пусть командный файл "cmp" имеет вид:
for i in "$*"
do

echo $i
done
echo

for i in "$@"
do

echo $i
done
При вызове

cmp aa bb cc
на экран будет выведено
aa bb cc
aa
bb
cc

1.5.Оператор цикла с истинным условием ("while")



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

список команд
done

где "while" - служебное слово определяющее тип цикла с
истинным условием. Список команд в теле цикла (между "do" и
"done") повторяется до тех пор, пока сохраняется истинность
условия (т.е. код завершения последней команды в теле цикла
равен "О") или цикл не будет прерван изнутри специальными


командами ("break", "continue" или "exit"). При первом входе в
цикл условие должно выполняться.

###

# print-50: Структура "while"

# Расчет позволяет напечатать 50

# экземпляров файла "file-22"

n=0

while [ $n -lt 50 ] # пока n < 50

do

n=`expr $n + 1`

cat file-22 > /dev/lp

done

Обратим внимание на то, что переменной "n" вначале
присваивается значение 0, а не пустая строка, так как команда
"expr" работает с shell-переменными как с целыми числами, а не
как со строками.

n='ехрг $n + 1`

т.е. при каждом выполнении значение "n" увеличивается на
1.

Как и вообще в жизни, можно реализовать то же самое и
сложнее. Расчет "pr-br" приведен для иллюстрации бесконечного
цикла и использования команды "break", которая обеспечивает
прекращение цикла.

###

# pr-br: Структура "while" с "break"

# Расчет позволяет напечатать 50

# экземпляров файла "file-22"
n=0

while true
do

if [ $n -lt 50 ] # если n < 50
then n='expr $n + 1`
else break
fi

cat file-22 > /dev/lp
done

Команда "break [n]" позволяет выходить из цикла. Если "n"
отсутствует, то это эквивалентно "break 1". "n" указывает число

вложенных циклов, из которых надо выйти, например, "break 3" -
выход из трех вложенных циклов.

В отличие от команды "break" команда "continue [n]" лишь
прекращает выполнение текущего цикла и возвращает на
НАЧАЛО цикла. Она также может быть с параметром. Например,
"continue 2" означает выход на начало второго (если считать из
глубины) вложенного цикла.

Команда "exit [n]" позволяет выйти вообще из процедуры с
кодом возврата "О" или "n" (если параметр "n" указан). Эта
команда может использоваться не только в циклах. Даже в
линейной последовательности команд она может быть полезна
при отладке, чтобы прекратит выполнение (текущего) расчета в
заданной точке.

1.6.Оператор цикла с ложным условием ("until")

Оператор цикла "until" имеет структуру:
until условие
do

список команд
done

где "until" - служебное слово определяющее тип цикла с
ложным условием. Список команд в теле цикла (между "do" и
"done") повторяется до тех пор, пока сохраняется ложность
условия или цикл не будет прерван изнутри специальными
командами ("break", "continue" или "exit"). При первом входе в
цикл условие не должно выполняться.

Отличие от оператора "while" состоит в том, что условие
цикла проверяется на ложность (на ненулевой код завершения
последней команды тела цикла) проверяется ПОСЛЕ каждого (в
том числе и первого!) выполнения команд тела цикла.

Программистов, знакомых с операторами "until" в других
языках может вначале сбивать такая семантика этого оператора.
Примеры.

until false
do
read х


if [ $x - 5 ]

then echo enough ;break
else echo some more
fi

done

Здесь программа с бесконечным циклом ждет ввода слов
(повторяя на экране фразу "some more"), пока не будет введено
"5". После этого выдается "enough" и команда "break" прекращает
выполнение цикла.

Другой пример ("Ожидание полдня") иллюстрирует
возможность использовать в условии вычисления.
until date |grep 12:00:
do

sleep 30
done

Здесь каждые 30 секунд выполняется командная строка
условия. Команда "date" выдает текущую дату и время. Команда
"grep" получает эту информацию через конвейер и пытается
совместить заданный шаблон "12:00:" с временем, выдаваемым
командой "date". При несовпадении "grep" выдает код возврата
"1", что соответствует значению "ложь", и цикл "выполняет
ожидание" в течение 30 секунд, после чего повторяется
выполнение условия. В полдень (возможно с несколькими
секундами) произойдет сравнение, условие станет истинным,
"grep" выдаст на экран соответствующую строку и работа цикла
закончится.

1.7.Пустой оператор

Пустой оператор имеет формат

Ничего не делает. Возвращает значение "О". Например, в
конструкции "while :" или ставить в начале командного файла,
чтобы гарантировать, что файл не будет принят за выполняемый
файл для "csh".


1.8.Функции в shell

Функция позволяет подготовить список команд shell для
последующего выполнения.

Описание функции имеет вид:
имя ()
{

список команд
}

после чего обращение к функции происходит по имени. При
выполнении функции не создается нового процесса. Она
выполняется в среде соответствующего процесса. Аргументы
функции становятся ее позиционными параметрами; имя
функции - ее нулевой параметр. Прервать выполнение функции
можно оператором "return [n]", где (необязательное) "n" - код
возврата.

Пример. Вызов на выполнение файла "fun"

echo $$

fn() # описание функции

echo xx=$xx

echo $#

echo $0: $$$1 $2

хх=уу ; echo xx=$xx

return 5

}

хх=хх; echo xx=$xx

fn ab # вызов функции "fn" с
параметрами

echo $?
echo xx=$xx

содержащего описание и вызов функции "ft", выдаст на
экран:

хх=хх

хх=хх

fun: 749 а b

хх=уу


5
хх=уу

1.9. Обработка прерываний ("trap")

 

Бывает необходимо защитить выполнение программы от

прерывания.

Наиболее часто приходится встречаться со следующими
прерываниями, соответствующими сигналам:

0 выход из интерпретатора,

1 отбой (отключение удаленного абонента),

2 прерывание от <Del>,

9 уничтожение (не перехватывается),

15 окончание выполнения.

Для защиты от прерываний существует команда "trap",

имеющая формат:

trap 'список команд' сигналы

Если в системе возникнут прерывания, чьи сигналы
перечислены через пробел в "сигналы", то будет выполнен
"список команд", после чего (если в списке команд не была
выполнена команда "exit") управление вернется в точку
прерывания и продолжится выполнение командного файла.

Например, если перед прекращением по прерываниям
выполнения какого то командного файла необходимо удалить
файлы в "/tmp", то это может быть выполнено командой "trap":
tarp 'rm /tmp/* ; exit 1` 1 2 15

которая предшествует прочим командам файла. Здесь, после
удаления файлов будет осуществлен выход "exit" из командного

файла.

Команда "trap" позволяет и просто игнорировать
прерывания, если "список команд" пустой. Так например, если
команда "cmd" выполняется очень долго, а пользователь решил
отключиться от системы, то для продолжения выполнения этой
команды можно написать, запустив команду в фоновом режиме:
( trap ' ' 1; cmd )&


 



<== предыдущая лекция | следующая лекция ==>
Команда «test» | Порядок выполнения работы


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.735 сек.