Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР2.docx
Скачиваний:
10
Добавлен:
12.02.2016
Размер:
84.16 Кб
Скачать

If - умовні переходи

У файлі iftst за допомогою if-запиту ми перевіряємо, чи були передані два параметри. Якщо цього не сталося, виводиться повідомлення про помилку. Програма завершується командою exit з повертається значенням, нерівним нулю (індикатор помилок). В іншому випадку вміст обох параметрів виводиться на екран.

#! / Bin / sh

# Приклад iftst if test $ # -ne 2; then

 echo "Команді має бути передано рівно два параметри!"

 exit 1 else

 echo "Параметр 1: $ 1, Параметр 2: $ 2" fi

Короткий тестовий запуск показує, як працює програма: user $ iftst a

Команді має бути передано два параметри!

user $ iftst ab Параметр 1: a, Параметр 2: b

Критерієм для умовного переходу є результат останньої команди перед then. Якщо ця команда повертає значення 0, то умова виконується. Якщо then вказується в тому ж рядку, що і попередня команда (без переходу на наступну), то команда повинна завершуватися крапкою з комою.

Зверніть увагу, що значення істинності (true) в bash дорівнює 0, а хибності (false) - не дорівнює 0. У більшості інших мов програмування значення прямо протилежні! Команди, що завершуються без помилок, повертають значення 0. Будь-яке значення, не рівне 0, вказує на помилку. Деякі команди повертають різні значення в залежності від типу помилки.

У попередньому прикладі умова була створено за допомогою команди test оболонки bash. При цьому оператор -ne означає «не дорівнює» (not equal). Команда test застосовується щоразу, коли необхідно порівняти один з одним дві послідовності символів або два числа, коли необхідно перевірити, чи існує файл, і т. д.

Попередню програму можна було сформулювати інакше: замість test може використовуватися короткий варіант в квадратних дужках. При цьому перед назвою команди [і після неї] потрібно ставити пробіл.

Крім того, із структури if можна виокремити другу команду echo, оскільки через наявність команд exit всі рядки коду, що йдуть після fi, будуть виконуватися тільки після того, як буде виконано умову.

#! /bin/sh

# Приклад iftst, 2. варіант

if [ $# -ne 2 ]; then

echo " Команді потрібно передати два параметри!"

exit 1

fi

echo "Параметр 1: $1, Параметр 2: $2"

Формулювання умов за допомогою test

В Bash неможливо прямо задавати умови, наприклад, для порівняння змінної і значення. По-перше, вся архітектура Bash заснована на тому, що всі дії здійснюються за допомогою команд, побудованих за однаковим зразком, по-друге, спеціальні символи <та> вже закріплені для виконання інших функцій. Тому для формулювання умов в циклах і точках переходу в Bash необхідно використовувати команду test. (Між іншим, test є самостійною командою і існує не тільки в Bash. Ця команда була інтегрована в Bash, щоб збільшити швидкість обробки даних).

Команда test повертає значення 0 (істина), якщо умова виконується, або 1 (не істина), якщо не виконується. Для скорочення друкованої роботи передбачений короткий варіант запису в квадратних дужках.

Команда test використовується для вирішення задач двох класів: для порівняння двох чисел, для порівняння послідовностей символів і для того, щоб дізнатися, чи існує файл і проявляє він певні властивості. У наступних прикладах показані деякі можливі варіанти застосування цієї команди.

  1. test "$х" - перевіряє, чи зайнятий х (тобто, якщо в послідовності символів міститься 0 символів, маємо «не істина»; в іншому випадку «істина»).

  2. test $х -gt 5 - перевіряє, чи має змінна х числове значення більше 5. Якщо х не містить числа, виводиться повідомлення про помилку. Замість -gt (більше) можуть також використовуватися наступні оператори порівняння: -eq (дорівнює), -ne (не дорівнює), -lt (менше), -le (менше або дорівнює) і -ge (більше або дорівнює).

  3. test -f $х – перевіряє, чи існує файл з ім'ям, зазначеним у х. Якщо необхідно інтерактивно виконувати команду test в оболонці, після неї потрібно зчитати значення змінної $? (Значення, що повертається останньою командою) за допомогою echo:

user$ a=20

user$ test $a - eq 20; echo $?

0

user$ test $a - gt 20; echo $?

1

Умовні переходи Case

Конструкції сase вводяться ключовим словом сase, за яким слідує параметр, призначений для аналізу (зазвичай це змінна). Після ключового слова in можна вказати кілька можливих шаблонів рядки, з якими буде порівнюватися параметр. При цьому можуть використовуватися ті ж джокерні символи, що і при роботі з іменами файлів. Шаблон завершується круглою дужкою, тобто, наприклад, - - *). Це робиться для розпізнавання таких послідовностей, які починаються з двох знаків «мінус». Кілька шаблонів можна відокремлювати один від одного символом |. У такому випадку перевіряються обидва шаблони. Наприклад, * .c | * .h) служить для розпізнавання файлів * .c і * .h в одному і тому ж розгалуженні програми.

Команди, що йдуть слідом за дужками, повинні завершуватися двома крапками з комою. Якщо буде потрібно перехід else, то в якості останнього шаблону необхідно вказати * такому шаблону будуть відповідати всі послідовності символів. При обробці конструкції з сase враховується тільки перший перехід, в якому параметр відповідає зазначеному шаблону.

У наступному прикладі casetst показано застосування сase для класифікації переданих параметрів на імена файлів. Цикл для змінної і виконується з усіма параметрами, переданими файлу оболонки. У цьому циклі кожен окремий параметр аналізується за допомогою сase. Якщо параметр починається з дефіса (-), то він знаходиться в кінці змінної OPT, в іншому випадку в кінці DAT.

#! /bin/sh

# Приклад casetst

opt= # Видалення opt і dat

dat=

for i do # Цикл для всіх переданих параметрів

case "$i" in

-* ) opt="$opt $i";;

* ) dat="$dat $i";;

esac

done # Кінець циклу

echo "Options: $opt" echo "Files: $dat"

Тестовий запуск файлу оболонки на практиці показує, як працює цей простий оператор вибору. Параметри, передані по порядку без сортування, поділяються на імена файлів і параметри:

user$ casetst -x -y dat1 dat2 -z dat3

Options: -x -y - z

Files: dat1 dat2 dat3

За тим самим принципом умовні переходи case можуть використовуватися для класифікації певних розширень файлів (шляхом зазначення пошукового шаблону * .abc). Якщо ви хочете щільніше зайнятися case-аналізом, подивіться файл оболонки /usr/bin/gnroff. У ньому дається синтаксис параметрів, що передаються Nroff, у вигляді, зрозумілому спорідненsq команді groff.

Цикл For

Цикли в Bash створюються за допомогою трьох команд. Команда for здійснює цикл з усіма елементами зазначеного списку. Команда while виконує цикл до тих пір, поки зазначена умова не перестане виконуватися. Команда until, навпаки, здійснює цикл до тих пір, поки зазначена умова не буде виконана. Всі три цикли можна достроково завершити командою break. Команда continue пропускає решту тіла циклу і запускає цикл заново.

У першому прикладі змінній і по черзі присвоюються послідовності символів а, b і c. У тілі циклу між do і done виводиться вміст змінної. Зверніть увагу, що в кінці списку, а також в кінці команди echo необхідно поставити крапку з комою. Відмовитися від цих крапок з комою можна лише тоді, коли ввід розділений на декілька рядків (часто таке трапляється в сценарних файлах).

user$ for i in a b c; do echo $i; done

a

b

c

Еквівалентне багаторядкове формулювання вищевказаної команди в сценарному файлі виглядатиме так::

#! /bin/sh

for i in a b c; do

echo $i

done

Список для for може бути побудований з використанням джокерних символів для імен файлів або з використанням конструкцій виду {..}, за допомогою яких створюються послідовності символів. У наступному прикладі всі файли * .tex копіюються в * .tex ~. (В Linux / UNIX тильда (~) в кінці імені файлу зазвичай означає резервну копію. При роботі з командою ср вираз $file кожного разу подається в лапках, щоб імена файлів, що містять пробіли, оброблялися правильно.)

user$ for file in *.tex; do cp "$file" "$file~"; done

Якщо цикли for створюються без in..., то змінні циклів отримують по порядку всі параметри, передані при виклику (тобто це відповідає in $ *). Приклад такого циклу наводиться при описі case. Але коли в прикладі з case передаються імена файлів, що містять пробіли, без проблем не обходиться. Bash інтерпретує прогалини як розділові знаки і обробляє частини імені файлу окремо. Щоб справитися з такою проблемою, застосовується наступна конструкція:

#!/bin/bash

# Цикл проходить через всі параметри,

# правильно справляється с пробілами в іменах файлів

for i in "$@"; do

ls -l "$i"

done

Цикли while

У наступному прикладі змінній і присвоюється значення 1. Потім значення змінної, що знаходиться в тілі циклу між do і done, при кожному виконанні циклу збільшується на 1, поки не буде перевищено значення 5. Зверніть увагу, що умови повинні вказуватися в квадратних дужках, як це робилося з умовними переходами if з командою test або з її скороченим варіантом.

user$ i=1; while [ $i - le 5 ]; do echo $i; i=$[$i+1]; done

1

2

3

4

5

Наступний цикл обробляє всі імена файлів, одержувані після виконання команди ls * .jpg:

ls *.jpg | while read file

do

echo "$file"

done

Цикли until

Єдина відмінність між циклами while і until полягає в тому, що умова формулюється з протилежною логікою. Наступна команда еквівалентна вищевказаному циклу while. При цьому для формулювання умови і> 5 застосовується оператор -gt (більше).

user$ i=1; until [ $i - gt 5 ]; do echo $i; i=$[$i+1]; done

1

2

3

4

5

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