Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
34
Добавлен:
27.03.2016
Размер:
341.5 Кб
Скачать

17.4 Керування перериваннями

Сигнали переривань виникають у випадках різних ненормальних ситуацій. Інтерпритатор shell керує більшістю цих сигналів і ряд з них він передає shell- процедурі, яка є активною у момент виникнення переривання. До таких сигналів відносяться наступні:

  1. сигнал 1, який виникає при відключенні термвналу;

  2. сигнал 2, який виникає при натисненні DEL;

  3. сигнал 8, який генерується командою kill –9 ноиер процесу;

  4. сигнал 15, який генерується командою kill без опцій.

Shell – процедура може вибирати, перехоплювати або ігнорувати кожний з цих сигналів (за виключенням сигналу 9). Якщо програма не перехоплює сигнали переривань при їх появі, інтерпритатор shell буде завершувати викликану в даний момент shell- процедуру. У ряді випадків це може приводити до втрати деяких тимчасових файлів, створених даною shell-процедурою. Щоб уникнути цього використовують команду trap (пастка) для перехопленнясигналів переривань.

Trap ‘<список команд>’ <сигнали>

Список команд повинен бути заключений у лапки. Якщо у список входить не одна команда, то кожна команда повинна бути відділена одна від одної крапкою з комою. У команді trap може бути визначено декілька сигналів, тому вони повинні бути розділені пропусками.

if test $# -eq 2

then echo PROCESSING

elif test $# -lt 2

then echo ‘missing second filensme’

else echo ‘too many arguments’

fi

test $# -eg 2 буде true тільки у тому випадку, якщо shell передає програмі тільки 2 аргументи.

Test $# -et 2 буде true, якщо число аргументів менше 2.

За допомогою test можна перевіряти ланцюжки символів

test –n < string > [існує ланцюжок символів]

test –z < string > [відсутній ланцюжок символів]

test < string 1 > = < string 2 > [тотожність 2 ланцюжків символів]

test < string 1 > !=< string 2 > [нетотожність 2 ланцюжків символів]

наприклад:

  1. if test -n “$2”

then echo PROCESSING

else echo ‘missing second filename’

fi

  1. Y= ‘abcd’

X=abcd

if test $Y=$X

then echo ‘they are the same’

else echo ‘they are different’

fi

У даному випадку пропуски у ланцюжок не виключаються. Тому програма визначить х=у.

for eachone in * [перевірка імен файлів у поточному каталозі]

do if test -f $eachone [запит “це файл ?”]

then if test -r $ eachone [якщо так, то він доступний до читання]

then cp $eachone $HOME/$1 [якщо так, копіювання файла до каталога $HOME/$1]

else num = ’expr $num +1’ [у протилежному випадку збільшити на 1 загальне число]

fi [недоступних для читання файлів у поточному каталозі]

fi

done

echo “$ num non-accessibles files”

За допомогою команди copyall копіюють поточний доступний файл, який не є каталогом, з поточного каталога у каталог, що визначається у начальному каталозі.

$ copyall newdir

Ця команда буде копіювати кожний доступний для читання файл у поточному каталозі у початковий каталог, у підкаталог newdir. Якщо newdir не існує, його буде створено. Якщо ж він існує перевіряється кожний файл з поточного каталога: спочатку чи звичайний це файл, а потім чи доступний він для читання. Якщо виконуються обидві умови, файл буде скопійовано у каталог newdir; якщо він не доступний длячитання, програма додасть 1 до загальної кількості таких файлів (змінна num). Після закінчення копіювання всіх файлів програма виведе на екран кількість недоступних для читання файлів.

Для перевірки співвідношення між двома числовими значеннями test використовує операції співвідношення:

- eq [A=B ?]

- ne [A не =B ?]

- ge [A>=B ?]

test A –le B [A<B ?]

- gt [A>B ?]

- lt [A<B ?]

У кожному випадку команда test перевіряє, чи має співвідношення значення true. Якщо співвідношення true, повертається 0, інакше не 0.

$ cat bigfiles

count=10000

for i in *

do size = ‘wc –c <$i’

if test $size –ge $ count

then echo “$i size: $size”

if

done

$_

Програма превіряє розмір усіх файлів у поточному каталозі, а потім виводить імена всіх файлів, які мають хоч 10000 символів. Вираз size = ‘wc -c <$i’ є підстановкою результата виконання команди , яка підраховує число символів у файлі, ім’я котрого в цей час присвоєно змінній і. Потім значення змінної size порівнюється зі значенням змінної count. Вираз test $size -ge $count буде true тільки тоді, коли $size більше або дорівнює 10000. У цьому випадку на екран виводиться ім’я файлу та його розмір. У деяких випадках програма перед обробкою може перевіряти аргументи.

За допомогою elif

$ cat newfile

if expr “$1” : ”Mark” > /dev/null

then echo Matching word is Mark

elif expr “$1” : “John” > /dev/null

then echo Matching word is John

elif expr “$1” : “Dennis” > /dev/null

then echo Matching word is Dennis

else echo *** No match ***

fi

$_

Для розгалудження по багатьом напрямкам використовують case

case < string > in

s1) < список команд>;;

s2) < список команд >;;

:::::::::::::::::::::::::::

sn) < список команд >;;

esac

Команда caseзрівнює шаблон string з кожним s1, s2, ….., sn, якщо фіксується збіг, буде виконуватись список команд, який йде за шаблоном і збігається зі string

Echo –n ‘please, enter your selection (from a to d) : ’

Read entry

Case $ entry in

A|a) echo ‘You have an apple.’;;

B|b) echo ‘Where’s the beef ? ’ ;;

C|c) echo ‘Coke adds life.’ ;;

D|d) echo ‘A grop in the bucket.’ ;;

*) echo ‘Please, type A, B, C, or D.’;;

easc

Соседние файлы в папке Додаткова інформація