You are on page 1of 31

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”

Кафедра безпеки інформаційних технологій

РОБОТА З КОМАНДНОЮ ОБОЛОНКОЮ BASH

МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи № 3
з дисципліни «Операційні системи»
для студентів спеціальності 125 «Кібербезпека»
спеціалізації «Безпека інформаційних і комунікаційних систем»

Затверджено
на засіданні кафедри
безпеки інформаційних технологій
протокол № __ від ____________ р.

Львів – 2018
Робота з командною оболонкою BASH: Методичні вказівки до
лабораторної роботи №3 з дисципліни «Операційні системи» для студентів
спеціальності 125 «Кібербезпека», спеціалізації «Безпека інформаційних і
комунікаційних систем» / Укл. В. А. Мельник, Я. В. Решетар, Т. Р. Борецький. -
Львів: НУ «Львівська політехніка», 2018. – 30 с.

Укладачі: Мельник В. А., д.т.н., доц.


Решетар Я. В., асист.
Борецький Т. Р., асист.

Відповідальний за випуск:
Зав. кафедри безпеки інформаційних технологій,
д.т.н., професор Максимович В.М.

Рецензенти:
Професор кафедри безпеки інформаційних технологій,
д.т.н., доцент Мороз Л.В.
Доцент кафедри безпеки інформаційних технологій
к.ф-м.н., доцент Войтусік С.С.

2
МЕТА РОБОТИ – набути базових навиків роботи та адміністрування в
системі Linux за допомогою командної оболонки BASH; ознайомитись з
особливостями оболонки, виконанням команд у ній, змінними середовища,
синтаксисом написання BASH-сценаріїв.

1. ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ

1.1. Оболонка BASH


Bash – це абревіатура від Bourne Again Shell. Це англомовна гра слів: bash
побудована на основі оболонки Борна (bourne), яка, разом з оболонками Korn і С,
вважається однією з класичних оболонок UNIX.
Оболонка в першу чергу призначена для виклику команд і програм в ОС
Linux. Таким чином, вона є свого роду інтерпретатором. Оболонка виконується в
будь-якому командному вікні, наприклад konsole, gnome-terminal, xterm, і в
текстовій консолі після входу в систему (логування).
У той же час оболонка є потужною мовою програмування, за допомогою
якої можна автоматизувати робочі процеси. Особливі команди оболонки
дозволяють використовувати в рамках цієї програми змінні, створювати запити,
цикли і т. п. Отримані в результаті проектування програми, залежно від
уподобань автора, називаються командними файлами, пакетними файлами,
сценаріями, процедурами оболонки. Незалежно від назви, мова в даному випадку
йде про прості текстові файли, які виконуються (інтерпретуються) оболонкою.
Майже у всіх дистрибутивах Linux bash вважається стандартною оболонкою
для взаємодії з ОС і вікнами терміналів. Однак, скориставшись системою
управління пакетами дистрибутиву, можна встановити також інші оболонки.
Наприклад дехто з професіоналів Linux віддає перевагу Z-оболонці – zsh, інші
варіантам оболонки Korn (ksh або pdksh) і С (csh або tcsh). Щоб випробувати
будь-яку з цих оболонок після установки, необхідно запустити командне вікно і
ввести в нього ім'я цієї оболонки. Команда exit повертає назад в попередню
активну оболонку.
user$ zsh
hostname% ls (виконання команди в zsh)
...
hostname% exit (вихід в попередню оболонку)
user$
1.1.1. Введення команд
Як правило, при роботі в bash вводяться звичайні команди. При цьому bash
полегшує роботу завдяки застосуванню великої кількості зручних сполучень
клавіш. Зокрема можна знову повертатися до недавніх команд за допомогою
клавіш управління курсором ↑ і ↓, що позбавляє від набору великого обсягу
інформації. При виході з оболонки останні введені команди зберігаються в файлі
~/.bash_history і, таким чином, стають знову доступними при наступному вході в
систему.

3
Рядки з командами можна змінювати в текстовому редакторі, тобто
вставляти і видаляти символи у будь-якому місці. Розкладку клавіатури в bash
можна конфігурувати практично довільно. Зокрема, на клавіатурі можна задавати
спеціальні символи (а також клавіші управління курсором і спеціальні клавіші)
для введення бажаних команд. Можна перемикатися між редакторами emacs і vi.
При цьому всі основні команди, пов'язані з редагуванням, залишаються присвоєні
одним і тим самим клавішам в обох редакторах.
1.1.2. Скорочення пов’язані з псевдонімами
При вводі команд оболонки можна суттєво скоротити роботу по набору за
допомогою команди alias. Вона визначає скорочення (псевдонім команди). При
обробці командного рядка програма перевіряє, чи міститься в першому слові
скорочення. Якщо це так, то скорочення замінюється повним текстом.
Скорочення для певних поєднань параметрів або імен файлів застосувати не
можливо, оскільки bash не шукає скорочень у всіх параметрах команди. Однак
bash розпізнає особливі випадки, коли в одному командному рядку
перераховуються декілька команд (наприклад, при використанні програмних
каналів, підстановці команд, послідовного виконання команд за допомогою ;), і
переглядає всі наявні назви команд – чи немає в них скорочень.
user$ alias cdb='cd ~kofler/linuxbuch'
Показана вище команда визначає скорочення cdb, за допомогою якої можна
здійснити перехід в каталог ~kofler/linuxbuch.
Виклики команди alias можна застосовувати і у вигляді вкладень. Зверніть
увагу на те, що скорочення alias мають пріоритет над однойменними командами.
Цю властивість можна використовувати для того, щоб перешкодити
небажаному виклику команди:
user$ alias more=less
Тепер при будь-якій спробі виконати команду more запускається потужна
програма less. Якщо ж з якихось причин знову знадобиться команда more, буде
потрібно вказати шлях до неї повністю (/bin/more) або поставити перед нею
зворотний слеш (\more). В такому випадку він перешкоджає інтерпретації
псевдоніма.
Скорочення alias можна знову видаляти за допомогою unalias. В іншому
випадку скорочення залишаються дійсними до того, як користувач покине
оболонку. Якщо потрібно залишити будь-які скорочення на постійній основі, слід
задати команди alias в файлах /etc/bashrc і ~/.bashrc в домашньому каталозі
користувача.
У багатьох дистрибутивах деякі скорочення псевдонімів задаються за
замовчуванням. Наприклад, якщо весь час надходить запит від rm щодо того, чи
слід видалити файл, це зазвичай пов'язане з заданим псевдонімом rm=rm -i.
Список всіх псевдонімів, дійсних зараз, повертає команда alias. У наступних
рядках показано, в яких каталогах дистрибутивів Debian, Fedora, SUSE і Ubuntu
розташовуються визначення псевдонімів.
Debian Fedora, Ubuntu: /etc/bashrc /etc/profile.d/*.sh ~/.bashrc
SUSE: /etc/bash.bashrc /etc/profile.d/*.sh ~/.bashrc ~/.alias
4
1.1.3. Механізми підстановки
Термін «механізм підстановки» здається дуже абстрактним і складним.
Основна ідея полягає в тому, що команди, утворені з застосуванням спеціальних
символів, замінюються їх результатами. У найпростішому випадку це означає:
при інтерпретації команди ls *.tex послідовність символів *.tex замінюється
списком відповідних файлів, а саме (наприклад): file1.tex, file2.tex.
Мета цього розділу коротко описати найважливіші механізми,
використовувані при інтерпретації команд (табл. 1), а саме: джокерні символи, що
застосовуються для побудови імен файлів, фігурні дужки для об'єднання
послідовностей символів, квадратні дужки для обчислення виразів, що містяться в
арифметичних дужках, зворотні апострофи для підстановки команд і т. д.

Таблиця 1. Механізми підстановки


Команда Функція
? Будь-який символ
Будь-яка кількість будь-яких символів (у тому числі жодного), але
*
не *-файли.
** Будь-які файли і каталоги, в тому числі із всіх підкаталогів
[abc] Один із символів вказаних в дужках
[a-f] Символ із сказаного діапазону
[!abc] Будь-які символи, окрім тих, що вказані в дужках
[^abc] Аналогічно попередньому
~ Скорочене позначення домашнього каталогу
. Поточний каталог
.. Каталог на один рівень вище
ab{1,2,3} Повертає ab1 ab2 ab3
a{1..4} Повертає a1 a2 a3 a4
$[3*4] Арифметичні обчислення
`команда` Заміна команди результатом її виконання
$(команда) Аналогічно попередньому
Команда “символи” Відміна інтерпритації будь-яких спеціальних символів, окрім $
Як і попередній варіант, але з більшими обмеженнями (не
Команда ‘символи’
допускає підстановки змінних)

Механізм підстановки, застосовуваний в даному випадку, називається


підстановкою параметрів. За допомогою цього методу можна аналізувати і
змінювати послідовності символів, збережені в змінних. Загальний синтаксис
такий: ${var__text}, де var – це ім'я змінної, _ один або два спеціальних символи,
а text – шаблон для пошуку або установка за замовчуванням.
Формування імен файлів за допомогою * і ?. Якщо вказати rm *.bak і
команда rm дійсно видалить всі файли з назвою, що закінчується на .bak, то це
відбудеться саме через bash. Оболонка переглядає поточний каталог в пошуках
відповідних файлів і замінює *.bak відповідними іменами файлів.

5
В якості джокерних символів використовуються ? (що означає будь-який
символ) і * (що означає будь-яку кількість будь-яких символів, в тому числі
жодного). Послідовність символів [a,b,e-h]* означає файли, імена яких
починаються з a, b, e, f, g або h. Якщо перший символ, зазначений в квадратних
дужках, це ^ або !, то допустимі всі символи, крім зазначених у дужках. Символ ~
можна використовувати в якості скороченої назви домашнього каталогу.
Функції спеціальних символів можна протестувати за допомогою наступної
команди echo. Перша команда повертає всі файли і каталоги, що знаходяться в
кореневому каталозі. Друга команда обмежує вивід файлами і каталогами, імена
яких починаються з літер від a до f.
user$ echo /*
/bin /boot /dev /etc /home /lib /lost+found /media /misc /mnt /net /opt
/proc /root /sbin /selinux /srv /sys /tmp /usr /var
user$ echo /[a-f]*
/bin /boot /dev /etc
Оскільки за формування імен файлів відповідає не конкретна програма, а
оболонка bash, результати можуть виглядати інакше, ніж очікує користувач.
Так, ls * може повернути практично нескінченний список файлів, навіть
якщо в поточному каталозі їх всього кілька. Команда ls після доповнення за
допомогою * поверне список всіх файлів і каталогів. Крім того, ls відображає не
тільки імена каталогів, а й їх вміст! Якщо необхідно отримати простий список
всіх файлів і каталогів, використовуйте параметр -d. Він забезпечує те, що вміст
каталогів, що задаються в рядку параметрів, окремо відображатися не буде.
Якщо необхідно забезпечити зворотний зв'язок з системою і відслідковувати
внутрішнє функціонування bash, можете виконати команду set -x. Тоді bash буде
відображати виконання всіх команд по мірі їх інтерпретації в командному рядку
(з будь-якими параметрами, які можна передавати команді і з доповнюваними
іменами файлів).
За замовчуванням * не враховує файлів і каталогів, імена яких починаються
з крапки (іншими словами, прихованих). Якщо потрібний такий ефект, необхідно
скористатися bash-параметром dotglob:
user$ shopt -s dotglob
user$ echo *
...
user$ shopt -u dotglob (dotglob знову деактивований)
Формування імен файлів за допомогою **. Починаючи з версії 4.0,
поєднання символів ** рекурсивно охоплює файли і каталоги. З міркувань
сумісності ця нова функція за замовчуванням деактивована. Якщо необхідно нею
скористатися (наприклад, в сценарії), слід встановити параметр bash globstar за
допомогою shopt –s.

6
user$ shopt -s globstar
user$ echo **
Формування послідовностей символів за допомогою {}. З послідовностей
символів, вкладених у фігурні дужки, bash утворює будь-які послідовності
символів. Офіційна назва такого механізму підстановки – розкриття дужок. Вираз
part{1,2a, 2b} означає part1 part2a part2b. Користуючись розкриттям дужок, можна
полегшити роботу, якщо необхідно звернутися до багатьох файлів і каталогів зі
схожими іменами. У порівнянні з джокерними символами * і ? є певна перевага –
можна утворювати імена ще не існуючих файлів (це стосується, наприклад,
mkdir).
user$ echo {a,b}{1,2,3}
a1 a2 a3 b1 b2 b3
user$ echo {ab,cd}{123,456,789}-{I,II}
ab123-I ab123-II ab456-I ab456-II ab789-I ab789-II
cd123-I cd123-II cd456-I cd456-II cd789-I cd789-II
Перечислення можна оформляти у вигляді {a..b}, причому a і b, можуть
бути як буквами, так і числами. Наступні приклади пояснюють принцип роботи
цієї функції:
user$ echo {1..5}
12345
user$ echo {z..t}
zyxwvut
Обчислення арифметичних виразів за допомогою []. Зазвичай в bash не
можна здійснювати обчислення. Якщо написати 2 + 3, то оболонка «не зрозуміє»,
що робити з цим виразом. Якщо необхідно обчислювати, працюючи з оболонкою,
потрібно вставити вираз в квадратні дужки і поставити перед ними символ $:
user$ echo $[2+3]
5
У квадратних дужках можна використовувати більшість операторів,
відомих з мови програмування С: +, -, *, / для чотирьох основних арифметичних
операцій, % для обчислень по модулю, == ,! =, <, <=,> і > = для порівнянь, << і >>
для зсувів бітів, !, && і || для логічних операторів NO, AND та OR і т. д.
Всі обчислення виконуються з 32-бітними цілими числами (діапазон чисел:
± 2 147 483 648). Якщо слід витягти окремі значення з змінних, перед змінними
необхідно ставити знак $.
Є ще один спосіб здійснювати обчислення – за допомогою команди expr. Це
самостійна команда Linux, що працює незалежно від bash.

7
Підстановка команд. Користуючись підстановкою команд, можна замінити
команду в командному рядку результатом цієї команди. Для цього команда
повинна бути вкладена між двома символами `. Альтернативний запис -
$(команда).
Другий метод кращий, тому що, по-перше, в такому випадку уникається
плутанина з трьома різними лапками ( " ‘ і `), по-друге, другий метод допускає
вкладення.
Позначена таким чином команда буде замінена результатом її виконання.
Подібний запис забезпечує вкладений виклик декількох команд, причому одна
команда передає результат свого виконання іншій. Дві представлені далі
рівнозначні команди прояснюють принцип роботи цього механізму:
user$ ls -lgo `find /usr/share -name '*README*'`
user$ ls -lgo $(find /usr/share -name '*README*')
Вищевказана команда спочатку виконує find /usr/share -name '*README*'.
Результат виконання цієї команди список всіх файлів, що знаходяться в
каталозі /usr/share і містять послідовність символів README. Тепер цей список
вставляється в командний рядок на місці команди find. Тоді командний рядок
може записуватися наступним чином:
user$ ls -lgo /usr/share/a2ps/ppd/README \
> /usr/share/a2ps/README
Результатом цієї команди є наступний вивід:
-rw-r--r-- 1 301 15. Feb 12:30 /usr/share/a2ps/ppd/README
-rw-r--r-- 1 1029 15. Feb 12:30 /usr/share/a2ps/README
...
Отримати такий результат, використовуючи звичайний програмний канал з
символом |, не вдасться. Команда ls не очікує ніякого стандартного введення, а
також ігнорує інформацію, передану find через програмний канал. І саме тому
наступна команда відображає тільки вміст поточного каталогу. Результати
пошуку виводитися не будуть!
user$ find /usr/share -name '*README*' | ls -l (не працює)
Є ще одне рішення, що дозволяє обійтися без підстановки команд: за
допомогою команди xargs дані стандартного введення передаються зазначеній
команді:
user$ find /usr/share -name '*README*' | xargs ls –l
Важлива перевага xargs полягає в тому, що обсяг даних, які можна
переробити, нічим не обмежений. При необхідності xargs викликає команду
неодноразово і передає ці дані в стандартний ввід в декілька етапів. Навпаки, при
підстановці команд максимальна довжина командного рядка обмежена, як
правило, кількома тисячами символів.

8
Якщо в іменах файлів містяться пропуски, передача таких імен може
викликати труднощі. Щоб уникнути цих проблем, передайте команді find
параметр -print0, а команді xargs – параметр -null. Наступна команда ставить для
всіх каталогів біт exucute:
user$ find -type d -print0 | xargs --null chmod a+x
Спеціальні символи в послідовностях. Оскільки в bash практично будь-
який символ, за винятком букв і цифр, має спеціальне значення, виявляється
неможливо використовувати такі знаки в послідовності символів і іменах файлів.
Ця проблема вирішується двома способами. Можна поставити перед спеціальним
символом зворотний слеш (\) або вставити всю послідовність символів в
апострофи або лапки. Вказавши апострофи, ви можете, наприклад, видалити файл
з ім'ям ab* $cd:
user$ rm 'ab* $cd'
Зверніть увагу: символ ' використовується для позначення послідовностей
символів, а ` - для підстановки команд. Ці символи не рівнозначні! Лапки
працюють майже так само, як і апострофи. У будь-якому випадку вони
накладають менше обмежень і дозволяють використовувати деякі спеціальні
символи ($, \ і `). Оскільки послідовність символів є в лапках, інтерпретуються
змінні оболонки, перед якими стоїть символ $:
user$ echo "This is the access path: $PATH"
Команда повертає в якості результату послідовність символів This is the
acсess path, за якою слідує вміст змінної оболонки – PATH.
Якщо застосувати не лапки, а звичайні апострофи, то вся послідовність
символів буде передана через echo в незмінному вигляді.

1.1.4. Змінні оболонки (cередовища)


Функціональність bash та багатьох інших програм Linux керується станами
так званих змінних середовища. Такі змінні можна порівняти зі змінними мови
програмування, проте в них можна зберігати тільки послідовності символів.
Присвоювання змінних оболонки здійснюється за допомогою оператора
присвоєння =. Щоб відобразити вміст змінної оболонки, потрібно скористатися
командою echo, при цьому перед ім'ям змінної необхідно поставити символ $:
user$ var=abc
user$ echo $var
abc
При присвоєнні змінних не можна залишати між оператором присвоювання
= і ім'ям змінної пропусків. Запис var = abc синтаксично невірний і працювати не
буде.
Якщо у значенні змінної оболонки повинні міститися пробіли або інші
спеціальні символи, то при присвоєнні всю послідовність символів необхідно
укласти в одиночні лапки:
9
user$ var='abc efg'
При присвоєнні можна записувати одну за одною відразу по кілька
послідовностей символів. У наступному прикладі змінній а присвоюється нова
послідовність символів, що складається з вмісту цієї змінної, послідовності
символів xxx і ще раз з вихідного вмісту:
user$ a=3
user$ a=$a'xxx'$a
user$ echo $a
3xxx3
У наступному прикладі наявна змінна PATH (зі списком усіх каталогів, в
яких може здійснюватися пошук виконуваних програм) доповнюється в
домашньому каталозі каталогом bin. Тепер можливо виконувати будь-які
команди, що знаходяться в цьому каталозі (не вказуючи шлях повністю).
user $ echo $PATH
/ Usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin
user $ PATH=$PATH' :/home/kofler/bin'
user $ echo $PATH
/usr/local/sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / home / kofler / bin
Обчислення із змінними можна виконувати в квадратних дужках описаним
вище способом:
user$ a=3
user$ a=$[$a*4]
user$ echo $a
Вміст змінних зберігається тільки в оболонці. При виході з оболонки ця
інформація втрачається. Якщо певні змінні потрібні знову, то присвоювання слід
проводити у файлі /etc/profile або .profile домашнього каталогу. Обидва файли
(якщо вони є) автоматично виконуються при запуску bash.
Якщо необхідно зберегти вміст однієї із змінних у файлі, то потрібно
виконати команду echo з переадресацією введення:
user$ echo $var > file

1.1.5. Локальні і глобальні змінні (змінні середовища)


Терміни «локальний» і «глобальний» для опису змінних взяті зі світу мов
програмування. Змінна оболонки вважається глобальною, якщо вона передається
далі при запуску команди або програми оболонки. Часто глобальні змінні
іменуються змінними оточення (environment variables).
Зверніть увагу, що всі змінні, отримані в результаті звичайного
присвоювання, можуть бути тільки локальними! Щоб задати глобальну змінну,
слід виконати export або declare -x.
10
Для управління змінними в оболонці існують численні команди, які
функціонально іноді дублюють одна одну. Наприклад, для оголошення глобальної
змінної можна використовувати як export, так і declare -x. Наступні приклади
наводяться для того, щоб прояснити ситуацію з дублюючими командами:
 a=3 Короткий спосіб запису let, змінна a є локальною
 declare a = 3 Присвоює локальній змінній а значення (як let)
 declare -xa = 3 Присвоює локальній змінній а значення (як export)
 export Показує всі глобальні змінні
 export a Робить змінну а глобальною
 export a = 3 Присвоює глобальній змінній а значення
 let a = 3 Присвоює глобальній змінній а значення
 local a = 3 Визначає змінну а як локальну (лише у функціях
оболонки)
 printenv Як і export, відображає всі глобальні змінні
 set Показує всі змінні (і локальні, і глобальні)
 unset a Видаляє змінну а
Якщо ви створюєте змінні, які повинні керувати роботою інших команд
Linux, ці змінні завжди повинні бути глобальними. Присвоювання змінних завжди
залишається дійсним тільки для однієї оболонки. Якщо ви працюєте з декількома
терміналами або вікнами терміналів, в кожному з них функціонує самостійна
оболонка, яка не залежить від інших. Зміна змінної в оболонці ніяк не впливає на
інші оболонки. Однак часто використовувані присвоювання змінних можна
записати у файлі ~ /.profile, який буде автоматично виконуватися при запуску
оболонки.

1.1.6. Найважливіші змінні оболонки


В принципі можна ввести скільки завгодно нових змінних, давши їм
довільні імена. При цьому не слід застосовувати змінні, які вже існують, оскільки
вони зазвичай інтерпретуються bash, а часто й іншими командами Linux. При
неконтрольованій зміні таких змінних можна пошкодити механізм обробки
команд Linux.
Нижче в алфавітному порядку будуть описані найважливіші змінні
оболонки bash.
 BASH містить ім'я файлу bash.
 HOME містить шлях до домашнього каталогу, наприклад /home/mk.
 LOGNAME зберігає логін (ім'я користувача).
 HOSTNAME містить хост-ім'я (ім'я комп'ютера).
 MAIL включає шлях до каталогу, в якому зберігається вхідна пошта
(тільки якщо встановлений локальний поштовий сервер).
 OLDPWD містить шлях до каталогів, що використовувалися останніми.
 PATH зберігає список каталогів. Якщо bash повинна виконати команду,
вона переглядає всі каталоги, перераховані в PATH, у пошуках команди. Каталоги
11
відокремлюються один від одного двокрапкою. Налаштування PATH в різних
дистрибутивах відрізняються, в різних місцях системи в ході запуску (Init-V,
Upstart). Найкраще робити власні зміни в /etc/profile або (якщо у дистрибутиві
передбачена така можливість) у файлі каталогу /etc/profile.d. Туди необхідно
вставити команду у відповідності з наступним зразком:
#Доповнення в /etc/profile або в /etc/profile.d/myown.sh
PATH = $PATH:/myown/bin
 З міркувань безпеки (щоб уникнути незапланованого виконання програм
у поточному каталозі), в PATH не вказується локальний каталог. Якщо необхідно
виконувати програми, що містяться в поточному каталозі, не вказуючи перед
ними ./, потрібно доповнити PATH крапкою.
 PROMPT_COMMAND може містити команду, виконувану кожного разу,
коли bash відображає запит на ввід.
 PS1 зберігає послідовність символів, вміст якої відображається поруч з
початком кожного рядка введення (ця послідовність називається підказкою, чи
запрошенням). У ній передбачені наступні послідовності символів: \t – поточний
час, \d – сьогоднішня дата, \w – поточний каталог, \W – остання частина
поточного каталогу (наприклад, X11 для /usr/bin/ X11), \u – ім'я користувача, \h –
хост-ім'я (ім'я комп'ютера), а також символ підказки \$ (\$ для звичайних
користувачів, # для адміністратора).
 PS2 схожа на PS1, але ця послідовність символів зазвичай
відображається тільки для багаторядкового введення (тобто якщо перший рядок
завершується символом \). Типова настройка ">".
 PWD містить шлях до поточного каталогу.
Крім описаних тут, зазвичай використовуються і багато інших змінних
оточення, які керують функціями оболонки, а також багатьох інших програм.
Список всіх заданих змінних можна вивести за допомогою команди printenv | sort.

1.2. Синтаксис bash сценарію


Всі файли оболонки повинні починатися з рядка, що складається з символів
#! та імені оболонки. У такому випадку для виконання файлу автоматично
викликається зазначена оболонка. Для більшості сценаріїв оболонки вказується
#!/bin/sh. Тільки якщо ви користуєтеся bash-специфічними функціями, потрібно
спеціально вказати #!/bin/bash.
Сценарії оболонки можуть виконуватися лише тоді, коли для них
встановлені біти доступу, що забезпечують читання (r) і виконання (x). Якщо
сценарії розташовані на зовнішніх носіях або сегментах дисків, потрібно
переконатися, що до дерева каталогів підключений параметр exec.
Якщо ви пишете колекцію власних сценарних програм для щоденного
використання, доцільно зберігати ці сценарії в одному і тому ж місці. В якості
каталогу підійде ~/bin.
Якщо додатково внести такі ж зміни у файл .profile, ці сценарні програми
можуть виконуватися і без вказівки повного шляху.
У деяких дистрибутивах робити це не потрібно, в них ~/bin завжди входить
до складу PATH.
12
#Addition in ~/.profile or in ~/.bashrc
PATH = $PATH ':~/bin'

1.2.1. Область визначення змінних в bash сценаріях


Щоб зрозуміти тонкощі використання змінних при виконанні програм
оболонки, необхідні базові знання про механізми запуску команд і програм
оболонки.
Для виконання команди або програми bash створює новий процес з власним
PID-номером (такий номер використовується усередині системи Linux для
ідентифікації процесу та управління ним). Новому процесу повідомляються
тільки ті змінні оболонки, які були оголошені як змінні оточення (export або
declare -x). Якщо команда запускається в пріоритетному режимі, bash продовжує
працювати на фоні цієї команди, чекаючи, поки вона буде виконана. В іншому
випадку обидві програми (тобто bash і запущена у фоновому режимі команда)
виконуються паралельно.
Особливий випадок – запуск програми оболонки. Програми оболонки
виконуються аж ніяк не в працюючій оболонці, а в спеціально запущеному для
цього командному підпроцесорі. У такому випадку одночасно працюють два
зразки bash один для інтерпретації команд, а інший для виконання програм
оболонки. Окремі командні підпроцесори потрібні оболонці для того, щоб можна
було паралельно виконувати кілька програм оболонки, щоб вони при цьому не
впливали один на одного (навіть якщо працюють у фоновому режимі).
Використання командних підпроцесорів особливо відбивається на
управлінні змінними в тих випадках, коли кожен підпроцессор (або оболонка)
володіє власним набором змінних. При запуску будь-якої іншої програми їй
повідомляються лише ті змінні інтерактивної оболонки, які були оголошені як
змінні оточення. Змінні оболонки і командного підпроцесора працюють повністю
незалежно один від одного, тобто при внесенні змін в один набір змінних це ніяк
не відбивається на іншому наборі.
Іноді може знадобитися оголосити в працюючій програмі нові змінні або
змінити наявні змінні. Щоб це вдалось, можна виконувати оболонкові програми і
в рамках вже запущеної оболонки bash, не використовуючи командний
підпроцесор. Для цього потрібно поставити перед ім'ям файлу оболонкової
програми крапку або пробіл. Саме так коротко записується команда оболонки
source.
Ось приклад: необхідно написати програму оболонки, яка б доповнювала
змінну PATH шляхом до поточного каталогу. Потрібна програма addpwd дуже
проста:
#!/bin/sh
# Оболонкова програма addpwd додає шлях до поточного каталогу
PATH=$PATH":"$(pwd)

13
Отже, тепер у змінній PATH зберігається її колишній вміст, двокрапка і
результат виконання команди pwd (остання частина зберігається завдяки
підстановці команд). Наступний контрольний прогін показує, що вміст змінної
PATH поточної оболонки зміниться лише тоді, коли перед командою addpwd буде
встановлено крапку (в командному підпроцесорі, що запускається при першому
зверненні до addpwd, PATH також змінюється, але ці зміни діють, поки
виконується addpwd).
user$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
user$ addpwd
user$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
user$ . addpwd
user$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user

1.2.2. Змінні які задаються оболонкою


Програми оболонки можуть звертатися і до деяких змінних, наперед
заданих bash. Ці змінні не можна змінювати в ході присвоєння, їх можна тільки
зчитувати. Ім'я змінної складається з різних спеціальних символів.
Змінна Значення
$? Повертає значення (коду повернення) останньої команди
$! Номер PID останнього запущеного процесу
$$ PID поточної оболонки
$0 Ім’я поточного файлу, який виконується в оболонці
$# Кількість параметрів, переданих програмній оболонці
Від $1 до $9 Параметр від 1 до 9
$* або $@ Сукупність всіх переданих параметрів

Змінні $0 - $9, $# і $* служать для інтерпретації параметрів, що передаються


програмі оболонки (пакетному файлу).
У зв'язку з інтерпретацією параметрів цікава команда bash під назвою shift.
Вона ніби переміщує передані параметри від змінної $0 до змінної $9. Якщо
виконати shift 9, то перші дев'ять параметрів, переданих програмі, будуть
втрачені, але тоді можна запросити наступні дев'ять. Якщо вказати shift без
додаткових параметрів, то список зсунеться на один параметр.

14
Змінну $? можна використовувати для визначення умов, щоб змінити
подальше виконання програми в залежність від результату останньої команди. В
принципі команду можна прямо задати як умову, вказавши її таким чином в if.
Змінна $$ містить PID (ідентифікаційний номер процесу). Це числове
значення застосовується всередині системи Linux для управління процесами. PID
є унікальним, тобто у всій системі гарантовано відсутній інший процес з таким
самим номером, тому таке значення добре підходить для створення тимчасового
файлу. Наприклад, за допомогою ls > tmp.$$ можна зберегти список всіх файлів у
файлі tmp.nnn. Навіть якщо такий самий пакетний файл одночасно працює на
іншому терміналі, у двох оболонках процеси будуть мати різні ідентифікаційні
номери, що виключає виникнення конфлікту на рівні імен.

1.2.3. Масиви
Окрім звичайних змінних, в bash також можна застосовувати масиви.
Зверніть увагу, що синтаксис для доступу до n-ого елементу відрізняється від
синтаксису, прийнятого в С.
x = () # Визначення порожнього масиву
x[0]='a' # Присвоєння елементів масиву
x[1]='b'
x[2]='c'
x=('a' 'b' 'c') # Короткий варіант запису чотирьох попередніх рядків
echo ${x[1]} # Зчитування елемента масиву
echo ${x[@]} # Зчитування всіх елементів масиву
Для програмістів виключно важливі масиви асоціативних елементів, які
стали підтримуватися в bash, починаючи з версії 4.0. Потрібно пам’ятати, що
масив спочатку потрібно спеціально оголосити як асоціативний за допомогою
declare -A. В іншому випадку система вважатиме, що це звичайний масив. Тоді
послідовності символів, що містяться в індексі, будуть інтерпретовані як 0, тому
вийде звичайний масив, що складається з одного-єдиного елемента (Index 0).
declare -A y #Визначення порожнього масиву асоціативних елементів
y[abc]=123 #Присвоєння елемента асоціативного масиву
y[efg]=xxx
y=( [abc]=123 [efg]=xxx ) # Короткий варіант запису двох попередніх рядків
echo ${y [abc]} # Зчитування одного елемента масиву
Ще одне важливе нововведення версії 4 полягає в тому, що за допомогою
команди mapfile можна порядково перетворити текстовий файл в елементи
звичайного масиву:
mapfile z < текстовий_файл

15
1.2.4. Зчитування змінних за допомогою read
За допомогою bash-команди read можна обробляти ввід користувача. Як
правило, для цього спочатку за допомогою echo задається короткий текст, який
повідомляє користувачеві, який ввід очікується (наприклад, y/n, числове значення
і т. п.). При цьому доцільно використовувати параметр -n, що дозволяє вводити
дані відразу ж після тексту echo, а не з наступного рядка. При виконанні
наступної команди read, bash очікує від користувача вводу рядка і натискання
клавіші Enter.
Візьмемо програму, в якій цикл while виконується до тих пір, поки у змінній
a не опиниться послідовність символів, яка задовольняє певним умовам. У
наступному прикладі ми бачимо, як працює ця програма:
user$ readvar
Введіть число: a
Невірно, повторіть ввід, будь ласка
Введіть число: 12
12
Після вводу інформації за допомогою read весь вміст змінної видаляється за
допомогою підстановки параметрів, якщо послідовність включає будь-які
символи, крім цифр, знаків «мінус» та пробілів. Правда, ця система контролю не
ідеальна (відповідно до неї допускається як послідовність символів 12-34-5, так і
12 34), але все ж дуже ефективна.
#! /bin/sh
# Приклад readvar: зчитування числового значення
a= # Видалення вмісту змінної а
while [ -z "$a" ]; do
echo -n "Введіть число: "
read a a=${a##*[^0-9, ' ', -]*} # Видалення послідовностей символів
# які містять будь які символи крім 0–9,
# знаку мінус та пробілу
if [ -z "$a" ]; then
echo " Невірно, повторіть ввід, будь ласка "
fi
done
echo $a

16
1.2.5. Умовні переходи та цикли в сценаріях bash
Умовні переходи в програмах оболонки створюються за допомогою команд
if і case. У той час як if краще підходить для звичайних операцій вибору, case
призначений для аналізу послідовностей символів (зіставлення зразків).
Умовні переходи 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 a b

Параметр 1: a, Параметр 2: b

Критерієм для умовного переходу є результат останньої команди перед then.


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

17
Попередню програму можна було сформулювати інакше: замість 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:

18
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"
19
echo "Files: $dat"
Тестовий запуск файлу оболонки на практиці показує, як працює цей
простий оператор вибору. Параметри, передані по порядку без сортування,
поділяються на імена файлів і параметри:
user$ casetst -x -y dat1 dat2 -z dat3
Options: -x -y - z
Files: dat1 dat2 dat3

За тим самим принципом умовні переходи case можуть використовуватися


для класифікації певних розширень файлів (шляхом зазначення пошукового
шаблону *.abc).
Цикл 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 кожного
разу подається в лапках, щоб імена файлів, що містять пробіли, оброблялися
правильно.
20
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 полягає в тому, що умова
формулюється з протилежною логікою. Наступна команда еквівалентна

21
вищевказаному циклу while. При цьому для формулювання умови і > 5
застосовується оператор -gt (більше).
user$ i=1; until [ $i - gt 5 ]; do echo $i; i=$[$i+1]; done
1
2
3
4
5

2. ПОРЯДОК ВИКОНАННЯ РОБОТИ

2.1. Припустимо, що необхідно написати командний файл, який реалізує


меню з трьох пунктів: 1) відносно поточного каталогу створює 3-рівневу
структуру. В кожному каталозі створюється файл в який записується поточний
час і дата, 2) копіює усі файли з даним розширенням у вказаному каталозі в
окрему директорію; розширення і директорія вказуються як параметри
командного файлу 3) об'єднує вміст усіх файлів з заданим розширенням і записує
їх у окремий підсумковий файл. Вихід з програми – q.

Приклад реалізації завдання


#!/bin/sh
while true; do

cat << end_of_cat

Виберіть пункт меню:


1) Створити 3-рівневу структуру каталогів;
2) Копіювати усі файли з заданим розширенням;
3) Об'єднати вміст файлів.
q) Завершити програму
end_of_cat

echo
read -p "Виконати пункт: " choice

case $choice in
1)
read -p "Введіть назву директорії 1-го рівня: " DIR1
read -p "Введіть назву директорії 2-го рівня: " DIR2
read -p "Введіть назву директорії 3-го рівня: " DIR3

mkdir -pv $DIR1/$DIR2/$DIR3


date | cut -d' ' -f2,3,5 > $DIR1/file_of_dir1
date | cut -d' ' -f2,3,5 > $DIR1/$DIR2/file_of_dir2
date | cut -d' ' -f2,3,5 > $DIR1/$DIR2/$DIR3/file_of_dir3
ls -lR $DIR1
;;
22
2)
read -p "Скопіювати в: " DIRCOPY
cp -v $2/*.$1 $DIRCOPY
;;
3)
cat $2/*.$1 | tee res_file | more
echo %%%% Підсумковий файл res_file записано %%%%
;;
q)
break
;;
*)
echo Вибрано неправильний пункт!
;;
esac
done

Результати виконання
user@localhost:$> my_script txt ~

Виберіть пункт меню:


1) Створити 3-рівневу структуру каталогів;
2) Копіювати усі файли з заданим розширенням;
3) Об'єднати вміст файлів.
q) Завершити програму

Виконати пункт: 1
Введіть назву директорії 1-го рівня: A
Введіть назву директорії 2-го рівня: B
Введіть назву директорії 3-го рівня: C
mkdir: created directory 'A'
mkdir: created directory 'A/B'
mkdir: created directory 'A/B/C'
A:
total 4
drwxr-xr-x 1 user users 26 кві 3 16:26 B
-rw-r--r-- 1 user users 24 кві 3 16:26 file_of_dir1

A/B:
total 4
drwxr-xr-x 1 user users 24 кві 3 16:26 C
-rw-r--r-- 1 user users 24 кві 3 16:26 file_of_dir2

A/B/C:
total 4
-rw-r--r-- 1 user users 24 кві 3 16:26 file_of_dir3

Виберіть пункт меню:


1) Створити 3-рівневу структуру каталогів;
2) Копіювати усі файли з заданим розширенням;
3) Об'єднати вміст файлів.
q) Завершити програму

23
Виконати пункт: 2
Скопіювати в: A/B
'/home/user/file1.txt' -> 'A/B/file1.txt'
'/home/user/file2.txt' -> 'A/B/file2.txt'
'/home/user/file3.txt' -> 'A/B/file3.txt'

Виберіть пункт меню:


1) Створити 3-рівневу структуру каталогів;
2) Копіювати усі файли з заданим розширенням;
3) Об'єднати вміст файлів.
q) Завершити програму

Виконати пункт: 3
Some text File 1
Some text File 2
Some text File 3
%%%% Підсумковий файл res_file записано %%%%

Виберіть пункт меню:


1) Створити 3-рівневу структуру каталогів;
2) Копіювати усі файли з заданим розширенням;
3) Об'єднати вміст файлів.
q) Завершити програму

Виконати пункт: 4
Вибрано неправильний пункт!

Виберіть пункт меню:


1) Створити 3-рівневу структуру каталогів;
2) Копіювати усі файли з заданим розширенням;
3) Об'єднати вміст файлів.
q) Завершити програму

Виконати пункт: q

2.2. Використовуючи перелік команд та інші довідкові матеріали розробити


командний файл для управління каталогами і файлами згідно варіанта завдання
вказаного в таблиці


Завдання
вар
Написати командний файл, який реалізує меню з трьох пунктів: перший пункт – дає
можливість користувачу вказати розширення файлу та каталог, другий пункт – створює
1 резервні копії всіх файлів з даним розширенням у вказаному каталозі, третій пункт –
рахує кількість файлів з заданим розширенням і записує їх число у файл.
Реалізувати командний файл, який в якості аргументу прийматиме число, що не
повинно виходити за рамки діапазону 0 – 10 (якщо число не в заданому діапазоні,
2 виводиться повідомлення про помилку) і розраховує відповідний член послідовності
Фібоначчі.
Написати командний файл, який реалізує меню з трьох пунктів, перший пункт – дає
3 можливість користувачу вказати назву директорії, обравши другий пункт користувач
отримує список всіх файлів в цьому каталозі, обравши третій пункт користувач
24
отримує список всіх підкаталогів цього каталогу. При виборі другого або третього
пункту в домашній директорії користувача створюється файл у який записується
кількість файлів чи підкаталогів відповідно.
Створити командний файл, який реалізує меню з двома пунктами: перший пункт
здійснює пошук заданої послідовності символів у текстовому файлі, другий пункт
здійснюватиме пошук заданої стрічки у бінарному файлі. Послідовність символів, яку
4 необхідно знайти і файл, в якому здійснюватиметься пошук, вказуються в якості
аргументів при запуску командного файлу. Здійснити перевірку чи існує заданий файл і
чи параметри передані коректно.
Створити командний файл, який реалізує меню з трьома пунктами: перший пункт –
реалізує зчитування з клавіатури послідовності символів, другий пункт – виводить
5 список файлів в назві яких є один із символів вказаних при виклику пункту 1, третій
пункт – видаляє файли в назві яких є один із символів вказаних при виклику пункту 1.
Написати командний файл, який реалізує меню з трьох пунктів: перший пункт –
вивести всіх користувачів, що в даний час працюють в системі; Другий пункт - послати
6 повідомлення користувачу, ім'я користувача, термінал і повідомлення вводяться з
клавіатури; Третій пункт - завершення.
Реалізувати командний файл, що дозволяє користувачу в циклі посилати всім активним
користувачам на всі відкриті термінали повідомлення або вказати номер конкретного
7 терміналу і відправити повідомлення лише на нього. Повідомлення вводиться з
клавіатури. Командний файл при старті виводить ім'я комп'ютера, ім'я користувача, що
запустив командний файл, тип операційної системи, IP-адресу машини.
Написати командний файл, що реалізує символьне меню. Перший пункт: робота з
інформаційними командами (реалізувати всі основні інформаційні команди). Другий
пункт повинен здійснювати копіювання файлів: у цьому пункті виводиться інформація
8 про вміст поточного каталогу, далі пропонується інтерфейс копіювання файлу:
введення імені файлу і введення каталогу для копіювання. Після виконання пункту
виводиться вміст каталогу, куди був скопійований файл і виводиться вміст
скопійованого файлу. Третій пункт: вихід.
Написати командний файл, що здійснює пошук однакових по їх вмісту файлів у двох
каталогах, наприклад, Dir1 і Dir2. Користувач задає імена Dir1 і Dir2 в якості першого і
другого аргументу командного рядка. В результаті роботи файли, наявні в Dir1,
9 порівнюються з файлами в Dir2 по їх вмісту. На екран виводяться кількість
переглянутих файлів і результати порівняння. Реалізувати пункт меню, який дозволить
користувачу видаляти файли з однаковим вмістом.
Написати командний файл, який реалізує меню з трьох пунктів: перший пункт – дає
можливість користувачу вказати розширення файлу та каталог, другий пункт –
10 переміщає всі файли з даним розширенням у вказаний каталог з одночасним
перейменуванням з приставкою new_, третій пункт – виводить основні атрибути файлів
з заданим розширенням і записує їх у файл.
Реалізувати командний файл, який в якості аргументу прийматиме число, що не
повинно виходити за рамки діапазону 0 – 9 (якщо число не в заданому діапазоні,
11 виводиться повідомлення про помилку) і розраховує суму усіх чисел з діапазону
вказаного числа.
Написати командний файл, який реалізує меню з трьох пунктів, перший пункт – дає
можливість користувачу вказати назву директорії та розширення файлу, обравши
12 другий пункт користувач отримує список всіх файлів в цьому каталозі з заданим
розширенням, обравши третій пункт користувач отримує список всіх підкаталогів та

25
файлів без вказаного розширення. При виборі другого або третього пункту в домашній
директорії користувача створюється файл у який записується розширений перелік
файлів з відповідним розширенням або без нього.
Створити командний файл, який реалізує меню з двома пунктами: перший пункт
здійснює пошук файлів з певною символьною послідовністю у назві, другий пункт
здійснюватиме пошук каталогів з цією послідовнстю у назві. Послідовність символів і
13 каталог, в якому здійснюватиметься пошук, вказуються в якості аргументів при запуску
командного файлу. Здійснити перевірку чи існує заданий каталог і чи параметри
передані коректно.
Створити командний файл, який реалізує меню з трьома пунктами: перший пункт –
реалізує зчитування з клавіатури послідовності символів, другий пункт – виводить
14 список файлів в тексті яких є один із символів вказаних при виклику пункту 1, третій
пункт – копіює файли в тексті яких є один із символів вказаних при виклику пункту 1 в
окремий каталог.
Написати командний файл, який реалізує меню з трьох пунктів: перший пункт –
вивести календар на наступний місяць (програма сама повинна визначати поточний
15 місяць); Другий пункт – записати інформацію про ім’я комп'ютера, тип ОС, активних
користувачів, системну дату та час в файл (ім'я файлу повинно вводитися з клавіатури);
Третій пункт - завершення.
Реалізувати командний файл, що дозволяє користувачу в циклі робити записи
повідомлень у текстовий файл або очистити його вміст. Повідомлення вводиться з
16 клавіатури, перед записом тексту у файл програма повинна вставляти поточний час.
Ім'я файлу вводиться як параметр скрипта. Командний файл при старті виводить ім'я
комп'ютера, ім'я користувача, що запустив командний файл, тип операційної системи.
Написати командний файл, що реалізує символьне меню. Перший пункт: вивести
системний час, ім'я поточного користувача, тип ОС, шлях до поточного каталогу.
Другий пункт повинен здійснювати перейменування файлів: у цьому пункті виводиться
17 інформація про вміст поточного каталогу, далі пропонується інтерфейс
перейменування файлу: введення імені поточного файлу і його нове ім'я. Після
виконання пункту виводяться основні атрибути перейменованого файлу. Третій пункт :
вихід.
Написати командний файл, що здійснює пошук порожніх файлів у певному каталозі (і
його підкаталогах). Користувач задає ім'я каталогу для пошуку як параметр командного
18 рядка. На екран виводяться загальна кількість переглянутих файлів і результати
пошуку.
Написати командний файл, який реалізує меню з трьох пунктів: перший пункт – дає
можливість користувачу вказати частину імені файлу та каталог, другий пункт –
19 здійснює пошук файлів у вказаному каталозі за частиною імені, третій пункт –
відображає основні атрибути доступу до файлів (якщо вони є у заданому каталозі).
Реалізувати командний файл, який в якості аргументу прийматиме число, що не
повинно виходити за рамки діапазону 0 – 15 (якщо число не в заданому діапазоні,
20 виводиться повідомлення про помилку) і розраховує суму квадратів усіх чисел в
діапазоні цього числа.
Написати командний файл, який реалізує меню з трьох пунктів, перший пункт – дає
можливість користувачу вказати назву директорії, обравши другий пункт користувач
отримує запит на введення розширення файлу, а потім список всіх файлів з заданим
21 розширенням в цьому каталозі (якщо вони є, в іншому випадку повідомлення про
відсутність таких файлів), обравши третій пункт користувач отримує можливість
скопіювати ці файли в окремий каталог. Назва каталогу вводиться користувачем.
26
Створити командний файл, який реалізує меню з двома пунктами: перший пункт
здійснює підрахунок символів у текстовому файлі, другий пункт –рядків у заданому
файлі. Контрольна кількість символів і рядків та файл, в якому здійснюватиметься
22 пошук, вказуються в якості аргументів при запуску командного файлу. Якщо кількість
слів або рядків у файлі не перевищує контрольної кількості замість результату
підрахунку виводиться попередження. Здійснити перевірку чи існує заданий файл і чи
параметри передані коректно.
Створити командний файл, який реалізує меню з трьома пунктами: перший пункт –
реалізує зчитування з клавіатури послідовності символів, другий пункт – виводить
23 список файлів в назві яких відсутні символи вказані при виклику пункту 1, третій пункт
– переміщає файли в назві яких є один із символів вказаних при виклику пункту 1
(каталог для переміщення вказується користувачем).
Написати командний файл, який реалізує меню з трьох пунктів: перший пункт –
вивести всіх користувачів, що в даний час працюють в системі; Другий пункт – змінити
пароль поточного користувача, ім'я користувача, попередній і новий пароль вводяться з
24 клавіатури. Паралельно старий пароль записати у файл; Третій пункт – автоматично
відновити попередній пароль з даних файлу. У разі успішного відновлення паролю
вивести повідомлення про це.
Реалізувати командний файл, що дозволяє користувачу в циклі додавати до змінної
середовища PATH новий шлях. Новий шлях вводиться з клавіатури. Командний файл
25 при старті виводить ім'я комп'ютера, ім'я користувача та поточне значення змінної
PATH. В скрипті передбачити можливість для перевірки значення змінної PATH.
Написати командний файл, що реалізує символьне меню. Перший пункт: Створити
локальну змінну і присвоїти їй порожнє значення. Ім'я змінної вводити через термінал.
Другий пункт повинен здійснювати пошук файлів у кореневому каталозі (/) за заданим
26 шаблоном. Шаблон повинен вводитися користувачем з терміналу. Третій пункт: додати
до значення локальної змінної повний шлях до каталогу в якому знаходиться перший
знайдений файл. В якості розділювача використати символ “;”
Написати командний файл, що здійснює пошук файлів в тексті яких зустрічається
певна символьна послідовність. Користувач задає символьну послідовність та каталог в
27 якому здійснюється пошук в якості першого і другого аргументу командного рядка. В
результаті роботи на екран виводяться кількість переглянутих файлів і перелік імен
знайдених файлів.
Написати командний файл, який реалізує меню з трьох пунктів: перший пункт – дає
можливість користувачу вивести перелік локальних змінних оболонки, другий пункт –
28 обчислити суму, добуток та різницю двох цілих чисел введених користувачем. У разі
введення інших значень (або нечислових символів) вивести попередження, третій
пункт – очистити значення локальних змінних.

3. ЗМІСТ ЗВІТУ
Звіт повинен містити:
 мету роботи, завдання (варіант студента);
 текст командного файлу;
 результати його виконання;
 висновки.

27
4. СПИСОК ЛІТЕРАТУРИ
1. Шеховцов, В. А. Операційні системи [Текст] : підруч. для студ. вищ. навч.
закл. / В. А. Шеховцов. - К. : BHV, 2005. - 575 с.
2. A. Silberschatz, P. B. Galvin, and G. Gagne. Operating System Concepts. John
Wiley & Sons, Hoboken, NJ, 9th edition, 2013.
3. W. Stallings. Operating Systems: Internals and Design Principles. Pearson
Education, Upper Saddle River, NJ, 9th edition, 2018.
4. A. S. Tanenbaum. Modern Operating Systems. Pearson Education, Upper
Saddle River, NJ, 4th edition, 2014.
5. Maurice Bach. “Design of the Unix Operating Systems”. Pearson Education,
Upper Saddle River, NJ, 2015.
6. Ken Rosen and James Farber. “Unix – The Complete Reference”. McGraw-
Hill Publishing Co. 1999.
7. D.A. Solomon: Inside Windows NT, Microsoft Press, 1998.
8. Daniel P. Bovet, Marco Cesati , Understanding the Linux Kernel, 3rd Edition.
O'Reilly Media (November 2005): 944 Pages.
9. Jonathan Levin, Mac OS X and iOS Internals: To the Apple's Core. Wiley
(2012), 864 pages.

28
Довідка щодо найважливіших спеціальних символів bash

Символ Значення

; Відділення команд одна від одної


: Команда оболонки, нічого не виконує
Запуск оболонки без власного командного підпроцессора
.
(.file відповідає вихідному файлу)
# Ввід коментаря

#!/bin/sh Ідентифікація оболонки, в якій буде виконуватись програма

& Виконання команди в фоновому режимі (com &)


Виконання одної команди в залежності від результату іншої
&&
(com1 && com2)
Переадресація стандартного виводу і помилок (відповідає
&>
>&)
| Створення програмних каналів (com1 | com2)
Виконання одної команди в залежності від результату іншої
||
(com1 || com2)
Джокерний символ для імен файлів (будь-яка кількість
*
символів)
? Джокерний символ для імен файлів (будь-який символ)
[abc] Джокерний символ для імен файлів (будь-який символ із abc)

[ expression ] Скорочений варіант запису test expression

(...) Виконання команд в тій самій оболонці ((сom1; сom2))


{...} Групування команд

Об’єднання декількох послідовностей символів (a{1,2,3} →


{,,}
a1 a2 a3)

Об’єднання декількох послідовностей символів (b{4..6} →


{a . .b}
b4 b5 b6)
~ Скорочене позначення домашнього каталогу
> Переадресація виводу в файл (com > file)
>> Переадресація виводу і додавання його в існуючий файл

29
>& Переадресація стандарт. виводу і помилок (відповідає &>)

2> Переадресація стандартного виводу помилок


< Переадресація вводу із файлу (com < file)
<< end Переадресація вводу із активного файлу до завершення
$ Позначення змінних(echo $var)
Номер PID останнього процесу, запущеного в фоновому
$!
режимі
$$ PID актуальної оболонки
Імя виконуваного в даний момент сценарного файлу
$0
оболонки
$1–$9 Перші 9 параметрів, переданих команді
$# Кількість параметрів, переданих програмі оболонки

30
НАВЧАЛЬНЕ ВИДАННЯ

РОБОТА З КОМАНДНОЮ ОБОЛОНКОЮ BASH

МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи №3
з дисципліни «Операційні системи»
для студентів спеціальності 125 «Кібербезпека»,
спеціалізації «Безпека інформаційних і комунікаційних систем»

Укладачі: Мельник Віктор Анатолійович,


Решетар Ярослав Васильович,
Борецький Тарас Романович

31

You might also like