Цикли в програмах оболонки UNIX

Фактично оболонку можна назвати мовою програмування: в ній є змінні, цикли, прийняття рішень і т д Основи організації циклів будуть розглянуті в цьому розділі, а про керуючу логіці програми поговоримо в розділі 5

Організація циклу по безлічі імен файлів застосовується повсюдно, при цьому єдиним оператором управління в оболонці, який можна вводити на терміналі, а не поміщати у файл для подальшого виконання, є оператор for Синтаксис for:

for  var  in  список слів

do

done

команди

Наприклад, за допомогою оператора for можна організувати виведення імен файлів по одному на рядку:

$ for  i in  *

&gt do

&gt            echo $i

&gt done

На місці i може стояти будь-яка змінна оболонки, але традиційно це i Зверніть увагу, що доступ до значення змінної забезпечується за допомогою $ i, але цикл for посилається на змінну як на

i У даному прикладі був використаний шаблон * – для того, щоб охва тить всі файли в поточному каталозі можна використовувати і будь-які інші списки аргументів Зазвичай завдання бувають цікавішими, ніж просто висновок імен файлів Часто доводиться порівнювати безліч файлів з більш ранніми версіями Наприклад, щоб порівняти стару версію глави 2 (вона зберігається в каталозі / old) з поточною:

$ ls ch2*  | 5

ch21               ch22               ch23               ch24               ch25 ch26               ch27

$ for  i in  ch2*

&gt do

&gt            echo $i:

&gt            diff -b  old/$i  $i

&gt            echo Додати порожній рядок для читаності

&gt done | pr  -h  &quotdiff  `pwd`/old `pwd`&quot  | lpr  &amp

$

Ми організували конвеєрне перенаправлення в pr і lpr тільки для того, щоб показати, що стандартний висновок команд всередині циклу for стає стандартним висновком самого for За допомогою параметра-h команди pr був створений гарний заголовок для виводу (два вкладених виклику pwd) І ще ми запустили всю цю послідовність команд в асинхронному режимі (&), так що нам не треба чекати її завершення & застосовується відразу до всього циклу і конвеєру

Автори вважають за краще такий формат оператора for, який використано в прикладі, але можливі й інші варіанти Наведемо основне обмеження: do і done сприймаються як зарезервовані слова, тільки якщо вони зявляються після символу нового рядка або крапки з комою Залежно від розмірів for, іноді буває зручніше записати все в одному рядку:

for  i in  список do команди done

Цикл for слід використовувати для великої кількості команд і у випадках, коли обробка вбудованого аргументу окремою командою неприйнятна

Але не застосовуйте його для однієї команди, яка буде перебирати імена файлів:

# Погана ідея: for i in $ *

do

done

chmod  +x $i

гірше, ніж

chmod  +x $*

тому що цикл for виконує окрему команду chmod для кожного файлу, що вимагає значно більших компютерних ресурсів (Переконайтеся, що ви розумієте різницю між

for  i in  *

де перебираються всі файли в поточному каталозі, і

for  i in  $*

де перебираються всі аргументи командного файлу)

Список аргументів для циклу for зазвичай утворюється за шаблоном для імен файлів, але може бути отриманий і іншим способом Це може бути

$ for  i in  `cat ..`

Але можна просто ввести аргументи з терміналу Наприклад, раніше в цьому ж розділі була створена група програм для виведення в декілька колонок (вони були названі 2, 3 і т д) Вони являють собою просто посилання (links) на один і той же файл, які можуть бути зроблені (після того як одного разу був записаний файл 2) за допомогою команди

$ for  i in  3 4 5 6  do ln  2 $i done

$

Наведемо більш цікавий приклад застосування циклу for – використовуємо pick, щоб вибрати файли, які будуть порівнюватися з файлами з каталогу резервного копіювання:

$ for  i in  `pick ch2*`

&gt do

&gt              echo $i:

&gt              diff old/$i $i

&gt done | pr  | lpr

ch21  y ch22 ch23 ch24  y ch25  y ch26 ch27

$

Очевидно, цей цикл повинен бути поміщений в командний файл, щоб наступного разу не довелося набирати все заново: якщо щось пророблено двічі, найімовірніше, це доведеться повторити знову

Вправа 315Якби цикл diff був поміщений в командний файл, варто було б поміщати в командний файл pick Обгрунтуйте відповідь ~

Вправа 316Що сталося б, якби останній рядок циклу, розглянутого вище, виглядала так:

&gt done | pr  | lpr  &amp

тобто закінчувалася б амперсандом Спробуйте здогадатися, а потім перевірте себе за компютером ~

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*