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

Всі файли оболонки повинні починатися з рядка, що складається з символів #! та імені бажаної оболонки. У такому випадку для виконання файлу автоматично викликається зазначена оболонка. Для більшості сценаріїв оболонки вибирається #!/Bin/sh. Тільки якщо ви користуєтеся bash-специфічними функціями, потрібно спеціально вказати #!/Bin/bash.

Сценарії оболонки можуть виконуватися лише тоді, коли для них встановлені біти доступу, що забезпечують читання (r) і виконання (x). Якщо сценарії розташовані на зовнішніх носіях або сегментах дисків, потрібно переконатися, що до дерева каталогів підключений параметр exec.

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

В якості каталогу підійде ~ / bin.

Якщо додатково внести такі ж зміни у файл .profile, ці сценарні програми можуть виконуватися і без вказівки повного шляху.

У деяких дистрибутивах робити це не потрібно, в них ~ / bin завжди входить до складу PATH.

# Addition in ~ / .profile or in ~ / .bashrc

PATH = $ PATH ': ~ / bin'

    1. Змінні в bash сценаріях

Область визначення змінних

Щоб зрозуміти тонкощі використання змінних при виконанні програм оболонки, необхідні базові знання про механізми запуску команд і програм оболонки.

Для виконання команди або програми bash створює новий процес з власним PID-номером (такий номер використовується усередині системи Linux для ідентифікації процесу та управління ним). Новому процесу повідомляються тільки ті змінні оболонки, які були оголошені як змінні оточення (export або declare -x). Якщо команда запускається в пріоритетному режимі, bash продовжує працювати на фоні цієї команди, чекаючи, поки вона буде виконана. В іншому випадку обидві програми (тобто bash і запущена у фоновому режимі команда) виконуються паралельно.

Особливий випадок запуск програми оболонки. Програми оболонки виконуються аж ніяк не в працюючій оболонці, а в спеціально запущеному для цього командному підпроцесорі. У такому випадку одночасно працюють два зразки bash один для інтерпретації команд, а інший для виконання програм оболонки. Окремі командні підпроцесори потрібні оболонці для того, щоб можна було паралельно виконувати кілька програм оболонки, щоб вони при цьому не впливали один на одного (навіть якщо працюють у фоновому режимі).

Використання командних підпроцесорів особливо відбивається на управлінні змінними в тих випадках, коли кожен підпроцессор (або оболонка) володіє власним набором змінних. При запуску будь-якої іншої програми їй повідомляються лише ті змінні інтерактивної оболонки, які були оголошені як змінні оточення. Змінні оболонки і командного підпроцесора працюють повністю незалежно один від одного, тобто при внесенні змін в один набір змінних це ніяк не відбивається на іншому наборі.

Іноді може знадобитися оголосити в працюючій програмі нові змінні або змінити наявні змінні. Щоб це вийшло, можна виконувати оболонкові програми і в рамках вже запущеної оболонки bash, не використовуючи командний підпроцесор. Для цього потрібно поставити перед ім'ям файлу оболонкової програми точку або пробіл. Саме так коротко записується оболонкові команда source.

Ось приклад: ви хочете написати оболонкову програму, яка б доповнювала змінну PATH шляхом до поточного каталогу. Потрібна вам програма addpwd дуже проста:

#!/Bin/sh

# Оболонкові програма addpwd додає шлях до поточного каталогу #

PATH = $ PATH ":" $ (pwd)

Отже, тепер у змінній 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

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

Програми оболонки можуть звертатися і до деяких змінним, наперед заданим bash. Ці змінні не можна змінювати в ході присвоювання, їх можна тільки зчитувати. Ім'я змінної складається з різних спеціальних символів.

Змінна

Значення

$?

Повертає значення останньої команди

$!

Номер PID останнього запущеного процеса

$$

PID поточної оболонки

$0

Ім’я поточного файла який виконується в оболонці

$#

Кількість параметрів, переданих програмній оболонці

Від $1 до $9

Параметр від 1 до 9

$* або $@

Сукупність всіх переданих параметрів

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

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

Змінну $? можна використовувати для визначення умов, щоб змінити подальше виконання програми в залежність від результату останньої команди. В принципі команду можна прямо задати як умову, вказавши її таким чином в if.

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

Масиви

Крім звичайних змінних, 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 <текстовий_файл

Зчитування змінних за допомогою 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

Умовні переходи та цикли в сценаріях bash

Умовні переходи в програмах оболонки створюються за допомогою команд if і case. У той час як if краще підходить для звичайних операцій вибору, case призначений для аналізу послідовностей символів (зіставлення зразків).

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