Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСКМ лекції.docx
Скачиваний:
0
Добавлен:
13.08.2024
Размер:
7.28 Mб
Скачать
      • Використання у програмах спеціальних символів

Як відомо, оболонка надає спеціальні значення символам > $% та ін. Як зробити, щоб оболонка сприйняла символи керування буквально, не асоціюючи з ними додаткових дій ? Це можна зробити декількома способами.

Можна заключити частину команди зі спеціальними символами у одинарні лапки. Наприклад, наступна команда виведе рядки файлу customers що починаються зі слова Mary:

grep '^Mary ' customers

Символ ^ задає для команди grep режим пошуку з початку рядка

Можна також використати і подвійні лапки. При цьому система ігнорує більшість службових символів (крім $ та `). Наприклад, результатом виконання команди

echo " ** Please enter your response -->"

буде

** Please enter your response -->

Однак, в результаті виконання такої команди:

echo ">>>Thanks for the $5, $LOGNAME"

буде підставлено значення п”ятого аргумента та змінної logname

Для завдання ігнорування оболонкою поодиночного символу треба використовувати символ зворотної косої риски, наприклад команда виведе $5 замість того щоб підставити значення аргумента:

echo " >>>Thanks for the \$5, $LOGNAME"

      • Використання команд керування процесом виконання

Серед операторів мови оболонки є два типа головних операторів керування: оператори циклу та умовні. З використанням умовних операторів if...then та case можна виконувати різні набори коду залежно від значень певних змінних. Розглянемо використання базових операторів керування на прикладах.

Оператор case

Оператор case дозволяє вибрати один з декількох варіантів дій залежно від значення змінної.

Синтаксис оператора case:

case word in

pattern) statement(s);;

pattern) statement(s);;

esac

Значення порівнюється з починаючи з першого. Якщо є співпадіння, то виконується відповідний оператор statement. Приклад програми:

# Назва: ShrtMenu

# Призначення: Надати користувачу вибір:

# роздрукувати файл, видалити файл

# або вийти з програми

# Вивести меню

echo 'Please choose either P, D, or Q to'

echo " [P]rint a file"

echo " [D]elete a file"

echo " [Q]uit"

# Отримати відповідь користувача

read response

# Використати case для вибору дій

case $response in

P|p) echo "Name of file to print?"

read filename

lp $filename;;

D|d) echo "Name of file to delete?"

read filename

rm $filename;;

*) echo "leaving now";;

esac

У тексті програми для перерахування можливих відповідей користувача використовувується запис P|p, що означає вибір великої, або малої літери p. Варіант вибору * означає усі інші варіанти вводу. Таким чином, якщо користувач введе символ, відмінний від P,p,D,d то буде виконуватися код виходу з програми.

Визначення статусу завершення команди

Оболонка завжди повідомляє про статус завершення виконання команди, або командного скрипта. Цей статус (exit status) подано у змінній $?. Наприклад, якщо команда

grep "American Terms" customers

використовується для пошуку виразу “American Terms” у файлі customers, то прочитати значення змінної статусу виконання можна командою

echo $?

Якщо потрібний вираз було знайдено, то значення статусу буде 0, інакше – інше число

Оператор if...then...else..fi

Оператор if..then..else..fi – це операторр галуження, який залежно від значення виразу дозволяє виконувати одну з гілок програми. Частина else оператора не є обов”язковою.

Формат оператора такий:

if cond_statement(s) then statement(s)1 [else statement(s)2] fi

Якщо статус виконання операторів cond_statement(s) є 0 (успішний), то виконується набір операторів statement(s)1, інакше - statement(s)2

Використання операторів циклу

Оболонка працює з двома типами операторів циклу – for та while.

Цикл for виконує дії для вказаного набору значень або файлів. Наприклад, щоб скопіювати усі файли, що мають розширення txt у каталог textdir, можна скористатися командою:

for i in *.txt

do

cp $i textdir/$i

done

Оболонка інтерпретує оператор та присвоює змінній i значення кожного файлу біжучого каталогу, що має розширення txt та виконує для нього копіювання у каталог textdir.

Розглянемо приклад використання оператора while. Нижченаведена програма повідомляє користувача про зміну статуса його файла поштової скриньки та прихід електронної пошти. Для порівняння версій файлів використовується команда diff. Програма працює у фоновому режимі і кожні 30 секунд перевіряє наявність нової пошти.

#Назва: checkmail

#Призначення: Повідомити користувачу про зміну у поштовій # скринці

ср $MAIL omail # Зробити копію скриньки для порівняння

#MAIL – це змінна що відповідає поштовій скринці

#поки omail та $MAIL співпадають, продовжити цикл

while diff omail $MAIL > /dev/null

do

ср $MAIL omail

sleep 30 # очікування, пауза у 30 сек

done

#Відбулися зміни

echo "New mail !!" | write $LOGNAME.