Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SPO_SRS.doc
Скачиваний:
5
Добавлен:
02.05.2019
Размер:
1.06 Mб
Скачать

4.4. Оператор циклу з|із| переліком|перерахуванням| ("for")

Оператор циклу "for" має структуру:

for ім'я [in список значень]

do

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

done

де "for" - службове слово що визначає тип циклу, "do" і "done" - службові слова, що виділяють тіло циклу. Не забувайте про "done"! Фрагмент "in список значень" може бути відсутнім.

Хай|нехай| команда "lsort" представлена|уявлена| командним файлом

for i in f1 f2 f3

do

proc-sort $i

done

В даному прикладі ім'я "i" грає роль параметра циклу. Це ім'я можна розглядати|розглядувати| як shell-змінну, якій послідовно привласнюються перераховані значення (i=f1, i=f2, i=f3), і виконується в циклі команда "procsort".

Часто використовується форма "for i in *", що означає "для всіх файлів поточного каталога".

Хай|нехай| "proc-sort" в свою чергу представляється командним файлом

cat $1 | sort | tee /dev/lp > ${1}_sorted

тобто послідовно сортуються вказані файли, результати сортування виводяться на друк|печатку| ("/dev/lp") і прямують у файли f1_sorted f2_sorted і f3_sorted

Можна зробити більш універсальною команду "lsort", якщо не фіксувати перелік файлів в команді, а передавати довільне їх число параметрами.

Тоді головна програма буде наступною|слідуючою|:

for i

do

proc-sort $i

done

Тут відсутність після|потім| "i" службового слова "in" з|із| переліком|перерахуванням| імен говорить про те, що список поступає|надходить| через параметри команди. Результат попереднього прикладу|зразка| можна отримати, набравши

lsort f1 f2 f3

Ускладнимо завдання|задачу| (під ім'ям "case-2") визначення холдингу фірми, що раніше розглядалося|розглядувалося|. Тепер можна при виклику указувати|вказувати| довільну кількість фірм. За відсутності в структурі оператора "for" фрагмента "in список значень", значення беруться з|із| параметрів зухвалої команди.

###

# holding: Довідник.

# Для різних фірм по імені видається

# назва холдингу, в який вона входить

for i

do

case $i in

ONE|TWO|THREE) echo Холдинг: ZERO ;;

MMM|WWW) echo Холдинг: Not-Net ;;

Hi|Hello|Howdoing) echo Холдинг: Привіт! ;;

*) echo Немає такої фірми ;;

esac

done

При виклику "holding Hello HELLO ONE" на екрані буде:

Холдинг: Привіт!

Немає такої фірми

Холдинг: 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]