1. Загальний огляд архітектури UNIX систем.
Короткий огляд UNIX подібних операційних систем.
У даний момент, не існує стандартної системи UNIX, замість цього ви зустрінетесь з безліччю операційних систем, що мають свої назви та особливості. Але за цими особливостями і назвами простежується загальна архітектура, інтерфейс і середовище програмування. Всі ці системи так чи інакше є спорідненими Із-за своєї простоти, ясності, легкої здатності до розширення і модифікації UNIX стали переносити на багато платформ. Однак незважаючи на безліч реалізацій базової системи, серед усіх них можна чітко виділити дві основні гілки: System V UNIX і BSD UNIX. Відмінності між ними не носять прінціпіяльний характер і часто сказати до якої з гілок належить та чи інша реалізація операційної системи буває складно. До основних відмінностей між System V і BSD подібними системами можна віднести термінальну ініціалізацію, імена конфігураційних файлів і файлів ініціалізації системи, стандартний розмір блоків файлової системи, управління терміналами, різне відображення інформації про процеси т.п. Одним словом принципових відмінностей з точки зору користувача між різними гілками операційної системи UNIX не існує. Розглянута Ця операційна система HP-UX 10.20 є однією з реалізацій UNIX випущеної фірмою Hewlett-Packard. За своєю структурою це чиста System V подібна 32-х розрядна операційна система, що включає підтримку симетричних багатопроцесорних систем (SMP), файлових систем більшого обсягу (до 128Гб) і розширеного віртуального адресного простору (до 3.75 Гб).
Основні причини популярності UNIX.
Які ж причини популярності цієї операційної системи? У першу чергу це більш ніж трьох десятирічний вік. За цей період вона повністю пройшла перевірку часом. По-друге код системи практично повністю написаний на мові високого рівня С, що зробило її простою для розуміння, внесення змін і перенесення на інші апаратні платформи. Деякі з версій UNIX поставляються разом з вихідними текстами, однак навіть попри те, що більшість UNIX поставляється у вигляді бінарних файлів, система все одно залишається легко розширюваної та замовною. Так само слід відзначити той факт що UNIX в спочатку створювалася як розрахована на багато користувачів і багатозадачна система орієнтована в першу чергу на виконання серверних функцій. Слід відзначити і той факт що UNIX практично з самого початку створювалася як мережна операційна система (навіть графічна оболонка UNIX система X Window є повністю мережевою), що дозволило їй зайняти лідируючі позиції на ринку серверів для Інтернет додатків і дало потужні вбудовані засоби віддаленого адміністрування. Чи не маловажну роль в популярності UNIX зіграла її єдина ієрархічна файлова система з уніфікованим доступом не тільки до файлів даних але і до апаратних ресурсів таким як диски, термінали, принтери, мережа, пам'ять и.т.п.
Структура операційної системи.
У завдання операційної системи UNIX входить безпосереднє управління ресурсами комп'ютера, розподіл їх між користувачами, приховуючи від останніх внутрішню архітектуру апаратного забезпечення, шляхом надання уніфікованого інтерфейсу доступу до апаратних ресурсів. До апаратних ресурсів комп'ютера відноситься в першу чергу обчислювальні ресурси процесора, пам'ять та дисковий простір, а також ряд периферійних пристроїв, таких як накопичувачі на магнітних стрічках, принтери, термінали, мережеві адаптери т.п. Найбільший загальний погляд дозволяє побачити дворівневу модель системи в тому вигляді як вона представлена на рис. 1.1.
Рис 1.1
У центрі знаходяться апаратні ресурси комп'ютера з якими безпосередньо взаємодіє ядро операційної системи ізолюючи прикладні програми користувача від особливостей апаратної архітектури. Ядро має певний мінімальний набір послуг, що надаватимуться прикладним програмам. У першу чергу це операції вводу-виводу (відкриття, закриття, читання, запис та керування файлами), створення і управління процесами, організація синхронізації й обміну даними між процесами, управління пам'яттю (реальної і віртуальної).
Другої найважливішою функцією виконуваної ядром є захист операційної системи від руйнування з боку користувача програм і реалізація механізмів захисту даних в багатокористувацької середовищі. Всі призначені для користувача програми користуються послугами ядра за допомогою системних викликів.
На другому рівні знаходяться програми, як для користувача, що забезпечують інтерфейс з користувачем так і системні, що керують роботою системи. Незважаючи на різні виконувані завдання, схеми їх взаємодії з ядром однакові.
Завдання виконуються ядром операційної системи
Зупинимося докладніше на структурі ядра операційної системи. Функціонально його можна представити що складається з трьох основних підсистем: підсистеми управління процесами і пам'яттю, підсистеми вводу-виводу і файлової підсистеми. Всі сучасні мікропроцесори підтримують віртуальну пам'ять, захищений і багатозадачність роботи. Останній передбачає виділення кванта процесорного часу певного завдання з подальшим перемиканням на інше завдання
Кожне завдання має ідентифікатор рівня захисту, деякі команди з системи команд процесора можуть виконуватися на будь-якому рівні захисту, але є привілейованих команди виконання яких можливе лише завданням має нульовий рівень привілеї. Ядро операційної системи працює на нульовому рівні захисту, тільки воно має безпосередній доступ до фізичної пам'яті, системним регістрів процесора і портів вводу виводу. Користувацькі програми спілкуються з ядром за допомогою системних викликів, що представляють собою команду приводить до перемикання процесу в контекст ядра, передачею параметрів ядру. Потім ядро перевіряє коректність параметрів, права користувацького процесу на можливість виконання даного системного виклику і лише після цього переходить до безпосереднього виконання всіх низькорівневих дій необхідних для виконання користувацького запиту. Завдяки цьому досягається захист критично важливих даних ядра від випадкового або навмисного руйнування з боку користувача.
Другий з найважливіших функцій ядра є обробка виняткових ситуацій що виникають в результаті роботи операційної системи і представляє собою програмні переривання. До останніх відносяться помилки захисту (на приклад спроба прикладної програми отримати доступ до портів введення-виведення чи чужий області пам'яті), помилки в роботі обладнання, а також системні події виникають при нормальній роботі операційної системи. Деякі з виключних ситуацій призводять до аварійного завершення системи (помилки обладнання або виняткова ситуація виникла під час обробки виняткової ситуації), деякі до аварійного завершення програми користувача при цьому можливий скидання на диск у файл образу процесу викликав виняткову ситуацію c метою подальшого аналізу відладчиком, а деякі просто життєво необхідні для нормального функціонування операційної системи (один з таких виняткових ситуацій буде розглянута нижче).
Підсистема керування процесами.
Запущена на виконання програма породжує в системі один або більше процесів. Підсистема управління процесами відповідає за створення та знищення процесів, розподілу ресурсом між процесами, синхронізацію і між процесами. Так як в даний момент часу на одному процесорі може виконуватися лише одне завдання ядро операційної системи в залежності від пріоритету задачі виділяє їй певний квант процесорного часу після закінчення якого відбувається перемикання на наступну задачу. При цьому виключається можливість захоплення всіх ресурсів процесора одним завданням і створюється ефект паралельного виконання кількох завдань.
Підсистема управління пам'яттю.
Підсистема управління пам'яттю управляє виділенням, розміщенням та звільненням пам'яті для прикладних задач. Прикладні програми ніколи не використовують фізичну пам'ять безпосередньо, тому що всі сучасні операційні системи реалізують так звану віртуальну пам'ять обсяг якої може перевищувати обсяг фізичної пам'яті. При цьому задіяно механізми сторінкової адресації пам'яті в яких всі віртуальний адресний простір розділяється на невеликі блоки - сторінки. Розмір сторінки варіюється в залежності від архітектури, для архітектури HP PA-RISC це 2К, для Intel це 4K. Кожна сторінка має спеціальні атрибути які визначають права доступу до неї, факт присутності у фізичній пам'яті, частоту звернень т.п. Перетворення з віртуального адреси у фізичний здійснюється апаратно. Дана схема адресації дає ряд незаперечних переваг які використовуються всіма сучасними операційними системами. А саме: можливість економії фізичної пам'яті шляхом спільного використання одних і тих же сторінок віртуальної пам'яті різними процесами, реалізація розділяється пам'яті, а також можливість використання вторинних пристроїв як пристрої пам'яті що дозволяє завданням задіяти віртуальної пам'яті більше ніж є реально фізичної пам'яті в системі. Реалізується це таким чином: у разі браку фізичної пам'яті, ядро скидає на зовнішній носій (як правило диск) сторінки до яких найбільш довго не було звернень, а так само при зверненні до сторінки якої реально немає у фізичній пам'яті процесор генерує виняткову ситуацію обробник якої завантажує сторінку назад з зовнішнього носія у фізичну пам'ять. Цей процес носить назву пейджинг або свопінг.
Файлова підсистема.
Файлова підсистема ядра надає уніфікований інтерфейс для доступу до даних знаходяться на дисках та інших зовнішніх пристроях. Вона забезпечує контроль прав доступу до файлів з боку прользователя тому кожен файл має атрибути доступу визначають права доступу до нього з боку певного прользователя або груп користувачів.
Підсистема вводу-виводу.
Підсистема вводу-виводу обслуговує запити файлової підсистеми і підсистеми управління процесами, щоб отримати доступ до периферійних пристроїв (мережеві адаптери, диски, термінали ...). Також вона забезпечує буферизацію і кешування даних і взаємодіє з драйверами пристроїв - спеціальними модулями ядра безпосередньо працюють із зовнішніми пристроями.
2.
Шеллі і основні команди HP-UX.
2.1.1 загальне знайомство з шеламі
2.1.2 Зміна Шела
2.2.1 Bourne Shell
2.2.1.1 Основні можливості Shell.
2.2.1.2 Shell скрипти
2.2.1.3 Основи програмування на мові shell
2.2.1.4 Деякі спеціальні команди
Загальне знайомство з шеламі
Шелл це інтерфейс між операційною системою і користувачем. Шелл інтерпретує для користувача введення і дає вказівки операційній системі виконати ті чи інші дії. Шелл можна також розглядати як мова програмування.
Bourne Shell. Це самий старший з шелов який був написаний Стефаном Борном в Лабораторії Беелла. Цей шелл є шолом за замовчуванням для HP-UX користувачів і довгий час був стандартом де факто.
Bourne Shell не має у своєму арсеналі ні інтерактивних можливостей ні складних програмних конструкцій на відміну від С та Korn Шелл.
C Shell. Цей йшов був розроблений Біллом Джоєм в Каліфорнійському Університеті Берклі. Його синтаксис має схожість з мовою програмування С. Він також має інтерактивний інтерфейс наприклад історію команд та розкриття імен файлів.
Korn Shell. Він є відносно новим шолом розробленим Девідом Корном в Лабораторії Белла і є догори сумісним з більшістю можливостей Bourne Shell. Так само як і С shell він має інтерактивні можливості, але виконується швидше має розширені можливості редагування командного рядка.
POSIX shell. Цей шелл базується на стандарті визначеному в Portable Operation System Interface (POSIX) - IEEE P1003.2. Цей стандарт був розроблений для прикладних і системних програмістів. Він фактично визначає стандарт на інтерфейс операційної системи. Більшість можливостей POSIX Shell дуже сильно схожі з аналогічними можливостями Korn Shell-a. Ми будемо розглядати обидва ці Шела єдине, вказуючи лише невеликі відмінності між ними. POSIX Shell має теж ім'я що і Bourne Shell тому він поміщений в/usr/bin/posix директорію на відміну від Bourne Shell, який знаходиться в директорії/usr/bin.
Key Shell. Це оболонка для Kourn Shell-a розроблена фірмою Hewlett-Packard. Вона дозволяє використовувати меню і онлайн допомогу допомагаючи в побудові команд та виконання ряду часто зустрічаються завдань, таких як перегляд, редагування та друк файлів, перегляд вмісту директорії т.п. Побудована вона таким чином що користувач може сам надалі
розширювати її можливості.
Bash. Назва цього Шела розшифровується як Bourne Again Shell. Він би розроблений консорціумом Free Software Foundation і незважаючи на те що за замовчуванням він відсутній у стандартній поставці HP-UX 10.20, в наслідок своїх потужних функціональних можливостей він користується величезною популярністю серед користувачів і адміністраторів HP-UX. Його інтерпретатор команд сумісний з Bourne Shell. Також він вмістив в собі корисні можливості Korn C Шелл. Він розроблявся в сооответствіі зі специфікаціями IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2).
2.1.2 Зміна Шела
Для того щоб визначити Ваш системний шелл досить відразу після логіна виконати команду:
echo $ SHELL
вона показує вміст змінної SHELL в яку система прописує Ваш шелл встановлений за замовчуванням. Для тимчасової зміни Шела досить виконати запуск бажаного Шела в поточному:
$ Ksh запуск Kourne Shell
$ Ps друк списку процесів
PID TTY TIME COMMAND
12320 pts/2 0:00 sh Bourne shell
12322 pts/2 0:00 ksh Korn Shell
12323 pts/2 0:00 ps
$ Exit вихід з Korn Shell-a
Для постійної зміни Шела що встановлюється системою після входу (login shell) необхідно виконати команду:
chsh
Зауваження: список шелов доступних в системі для користувачів знаходиться у файлі/etc/shells
Bourne Shell.
2.2.1.1 Основні можливості Shell.
Запуск шелла і вихід з шелла
Для запуску Bourne Shell досить ввести sh в поточному Шелі. Вихід з Шела можливий або по команді exit або ввівши в терміналі символ Коца файлу Ctrl-D.
Послідовне виконання команд.
Кілька команд можна послідовно виконувати розмежовуючи крапкою з комою. Наприклад, фрагмент
$ Who
$ Ps-ef
$ Ls-l
і
$ Who; ps-ef; ls-l
дадуть повністю однаковий результат.
Фонове виконання.
Запуск програми у фоновому режимі (без блокування поточного Шела) досягається додаванням в кінець команди знака &
Перенаправлення вводу-виводу.
Кожна запущена програма має три асоційованих каналу: стандартний ввід, стандартний висновок і стандартний канал діагностики помилок. За замовчуванням стандартний ввід закріплений за клавіатурою а стандартний висновок і канал помилок закріплені за монітором. Однак шелл дозволяє зв'язати ці канали з файлами абсолютно прозоро для виконуваної программми, тому що зміни виведення та введення здійснюються на системному рівні. Приклади перенаправлень вводу-виводу:
Символ Функція Приклад
<Перенаправлення введення з файлу program
> Перенаправлення виводу в файл program> out_file
>> Перенаправлення виводу у файл з додаванням Program>> out_file
Пайп. Дві або більше програм можуть бути об'єднані таким чином що результат однієї програми потрапить на вхід інший. При цьому дані від однієї програми до іншої прямують через програмний канал, наприклад:
program1 | program2 | program3
або більш реалістичний приклад:
ls-l/etc | more
Примітка: пайпи завжди працюють лише в одному напрямку - зі стандартного виходу однієї до стандартного входу іншої програми.
Розширення імен файлів.
З метою зменшення кількості набраних символів під час введення імен файлів йшов підтримує метасимволи. Нпрімер для того, щоб вивести лістинг всіх файлів в поточній директорії імена яких починаються на літеру a досить скористатися командою ls-la *
нижче наведена таблиця основних метасимволів
Метасимволи Опис
* Чи означає любого символу у будь-якій кількості
~ Чи означає шлях до домашнього каталогу
? Будь-який символ в кількості один або більше
[...] Рівність будь-якого одного з символів укладених у дужки. Пара символів розділена знаком мінус означає будь-який символ з проміжку між ними. Наприклад [a-zA-Z] - любаялатінская буква
2.2.1.5 Shell скрипти
Виконання скриптів.
Кілька команд обьедененних однією послідовністю виконання називається скриптом. Наприклад послідовне виконання команд, пайпи є простими скриптами. Зазвичай команди з яких складаються скрипти зберігають у файлах. Для запуску скрипта можна скористатися двома методами:
sh
або встановити атрибут виконуваності на файл командою
chmod + x
Після чого можна виконувати скрипт:
./
Виведення тексту.
Для формування висновку текстової інформації в скриптах використовують команду
echo "рядок"
Файл.profile.
Кожного разу під час входу в систему Bourne Shell автоматично запускає файл.profile (скрипт) знаходиться у вашій домашній директорії. Цей скрипт встановлює "оточення" в якому Вам має працювати. Це різні змінні оточення відповідають за вид системної підказки, шлях пошуку виконуваних файлів, тип терміналу т.п. Наведемо список основних змінних оточення.
* PATH встановлює шлях пошуку файлів, що виконуються і являє собою набір директорій розділених двокрапкою
* MAIL визначає ім'я файлу поштової скриньки для повідомлення про прихід нової електронної пошти
* MAILCHECK параметр показує як часто (в секундах) слід перевіряти поштову скриньку на предмет приходу нової пошти
* HOME визначає домашній каталог (каталог за замовчуванням). Команда cd без параметрів виконує перехід в цей каталог.
* PS1 основна системна підказка (по промовчав $)
* PS2 вторинна системна підказка (за замовчуванням>)
* SHELL ім'я логін шелла користувача
* TERM тип терміналу користувача
* EDITOR ім'я текстового редактора за замовчуванням
Встановлювати змінні оточення можна по різному. Наприклад команди
PATH =/bin:/usr/bin:/usr/sbin:/usr/contrib/bin:/usr/local/bin
і
PATH =/bin:/usr/bin:/usr/sbin
PATH = $ PATH::/usr/contrib/bin:/usr/local/bin
повністю еквівалентні. Для того щоб ці змінні увійшли в системне оточення (крім Шела, стали доступні і інших програм) необхідно виконає команду
export
Коментарі.
Текст наступний за символом # розглядається шолом як коментар і не має жодного впливу на роботу скрипта.
Основи програмування на мові shell
Параметри.
На додаток до стандартних параметрах Шела можна створювати свої параметри, кторые потім можна використовувати в командах. Наприклад
$ X = test
$ Echo $ x
test
$ Aaa =/
$ Ls $ aaa
cdrom home nsmail tcb var
SD_CDROM dev lib opt tmp
TT_DB etc lost + found sbin tmp_mnt
Bin export net stand usr
При включенні параметрів в рядок або в вираз знак $ повинен передувати параметру. Також необхідно користуватися наступними правилами:
$ (parameter) значення параметра укладеного в дужки буде використано у виразі. Дужки () використовуються коли за параметром дотримуються букви або цифри не пов'язані з парамаметру. Наприклад, якщо значення параметра xxx одно test то значення виразу $ (xxx) 123 буде дорівнювати test123
$ (parameter:-word) якщо параметр встановлений і не порожній то результатом виразу буде значення параметра, в іншому випадку в результаті буде використано значення параметра word. Наприклад: $ (xxx: -/usr/bin/sh)
якщо xxx порожній то результатом виразу буде рядок/usr/bin/sh
$ (parameter: = word) якщо параметр невстановлені або порожній, тоді значення word буде результатом вираження.
$ (parameter: + word) якщо параметр встановлений і не порожній, тоді результатом вираження є word, в іншому випадку результат порожній.
Аргументи командного рядка.
Коли Ви запускаєте на виконання програми, Ви можете передавати їй один чи більше аргументів. Шелл скрипти мають доступ до цих аргументів за допомогою параметрів $ 0, $ 1, $ 2 ... $ 9. Якщо аргументів більше дев'яти, їх значення поміщаються в буферу і можуть бути доступні з використанням команди shift яка буде обговорюватися нижче. Параметр $ 0 завжди приймає значення імені виконуваного файлу, $ 1 - перший аргумент командного рядка, $ 2 - друга, тощо
Кількість аргументів командного рядка завжди можна дізнатися проаналізувавши параметр $ #. В разі якщо Вам потрібен один параметр, що містить всі аргументи командного рядка розділені пробілом потрібно воспоьзоваться параметром $ *.
Для отримання доступу до аргументів з номером більше дев'яти необхідно скористатися командою shift. Після чергового виконання команди shift відбувається зсув на один елемент у буферу параметрів у результаті якого значення параметра $ 2 отримує параметр $ 1, значення параметра $ 3 отримує $ 2, тощо Використовуючи цикл (цикл будуть рассвотрени нижче) у поєднанні з командою shift можна отримувати доступ до всіх аргументів командного рядка з номерами, що перевищують 9.
Квотінг.
Дуже часто трапляються ситуації коли необхідна особлива трактування тих символів які шелл сприймає як спец символи. Наприклад випадок коли рядок тексту включаючи пробіли потрібно передати як один аргумент або знак $ повинен не бути сприйнятий як покажчик на параметр. Для цих цілей використовується квотінг (quoting).
Наприклад символ бекслеша () можна використовувати для квотінга символу $.
$ Param = aaa
$ Echo $ param
aaa
$ Echo $ param
$ param
У поєднанні з бекслешем для квотінга можна використовувати подвійні лапки. Наприклад:
echo "$ param is a" new directory ""
aaa is a "new directory"
При цьому знак $ всередині подвійних лапок інтерпретується як покажчик на параметр а бекслеш використовується для "захисту, в" внутрішніх лапок.
Одинарні лапки також можна використовувати для квотінга але на відміну від подвійних вони "екранують" все що знаходиться всередині них. Різниця одразу стає зрозумілою після заміни в попередньому прикладі подвійних лапок одніранимі:
$ Echo '$ param is a "new directory"'
$ param is a "new directory"
Підстановка команд.
Символ зворотного наголосу ( `) використовується в скриптах вказує на підстановку команд. Це має на увазі що результат виводу команди підставляється в шелл як параметр. Нпрімер:
$ Echo "The current date is` date `"
The current date is Sat Jan 6 04:16:35 GMT 2001
або
$ Users = `who`
$ Echo "Users currentrly logged in the system: n $ users"
Users currentrly logged in the system:
root console Jan 6 03:57
roman pts/0 Jan 5 23:12
Умови.
Дуже часто трапляються ситуації при написанні скриптів коли необхідно виконувати ті чи інші команди в залежності від конкретних умов.
Наприклад, потрібно відсортувати файл, а в разі його відсутності вивести повідомлення про помилку. На цей випадок шелл має умовний оператор, і зазначена завдання вирішується з його використанням в такий спосіб:
if test-f $ 1
then
sort $ 1
else
echo "file $ 1 doesn't exist"
fi
Умовний оператор має наступний синтаксис:
if
then
elif
then
... ..
else
fi
Оператор if перевіряє статус виконаної команди (у даному прикладі test-f)
І в разі успіху (програма повертає 0) виконує команди стоять після then, в іншому випадку виконуються команди else/elif.
Найбільш часто використовується командою в оператореусловія є команда test. Вона має безліч опцій, повний список яких можна отримати звернувшись до її документації виконавши команду man test.Очень часто замість команди test використовують команду [яка є її фунуціональним аналогом. Тут наводиться лише короткий список основних опцій команди test.
-r file повертає успіх якщо файл існує і доступний для читання.
-w file повертає успіх якщо файл існує і доступний для запису.
-x file повертає успіх якщо файл існує і що виконується.
-f file повертає успіх якщо це регулярний файл.
-d file повертає успіх якщо це директорія.
-c file повертає успіх якщо це спеціальний файл.
-s file повертає успіх якщо файл має ненульовий розмір.
-h file повертає успіх якщо це сімлінка.
-z s1 повертає успіх якщо довжина рядка s1 нульова.
-n s1 повертає успіх якщо довжина рядка s1 ненульова.
s1 = s2 перевірка двох рядків на рівність.
s1! = s2 перевірка двох рядків на нерівність
s1 повертає успіх якщо рядок s1 непорожній
n1-eq n2 Алгебраїчна перевірка двох чисел n1 і n2 на
рівність. Крім-eq є ще ряд опцій для алгебраїчного
порівняння такі як-ne,-gt,-ge, ...
Всі перераховані вище умови можуть обьеденяться з використанням логічних операторів:
! заперечення
-a Бінарний І
-o Юінарний АБО (-а має пріоритет більший ніж-о)
(Expr) Угрупування виразів дужками
Введення даних.
Для введення іданних в скрипт можна скористатися командою
read [parameter ...]
яка в якості аргументів приймає список з одного або більше параметрів.
Примітка: знак $ перед іменем параметра в команді read ставити не потрібно.
Цикли.
Дуже часто при складанні скриптів простого послідовного виконання буває недостатньо. Необхідні механізми, які дозволяли б виконувати команди з змінними параметрами. Для цих цілей шелл надає в розпорядження три ціклічекіе конструкції: цикли for, while та untill.
Цикл for
Цей тип циклів дозволяє виконувати один і той же набір команд кожного разу з новими значеннями отриманими зі списку параметрів. Він має такий вигляд:
for parameter [in wordlist]
do command-list
done
де parameter це будь-яке ім'я параметра, wordlist - одна або кілька значень послідовно привласнюються параметру, command-list - набір команд які виконуються при кожному проході циклу. wordlist може бути або просто набором аргументів розділених пробілом, або командою шелла яка генерує сама аргументи. Наприклад наступний код:
for i in 1 2 3 4 5
do
if mkdir $ i
then
echo "directory $ i was created"
fi
done
створює послідовно директорії з іменами 1 2 3 4 5 і в разі успішного створення директорії видає повідомлення. Наступний скрипт:
for i in `ls a *`
do
cp $ i/tmp
echo "$ i was copied"
done
копіює всі файли що починаються на літеру a з поточного каталогу в каталог/tmp.
Цикл while
while command-list1
do command-list2
done
цей цикл запускає команди зі списку command-list1, і якщо остання команда зі списку виконали успішно (код повернення дорівнює 0) то починають виконуватися команди зі списку command-list2, у противному випадку цикл закінчується. Цикл з такого прикладу:
while [-r $ 1]
do
echo "processing $ 1"
cat $ 1>> summary
shift
done
по черзі зчитує аргументи командного рядка, у разі коли в поточному каталозі присутній файл доступний на читання з ім'ям збігається з цим аргументом, вміст цього файлу дописується до файлу з ім'ям summary. В іншому випадку, скрипт припиняє свою роботу.
Цикл util
until command-list1
do command-list2
done
конструкція цього циклу повністю аналогічна циклу while за винятком того що тіло циклу (набір команд command-list2) виконується як мінімум один раз не залежно від успішності виконання умови циклу (набір команд command-list1).
Оператор case
Оператор case є розширенням стандартного умовного оператора if. Якщо є умова при якому може реалізовуватися безліч варіантів то замість серії операторів if краще використовувати один case.
case parameter in
pattern1 [| pattern2 ...]) command-list1;;
pattern2 [| pattern3 ...]) command-list2;;
...
esac
шаблони pattern визначають варіанти параметра parameter. При збігу параметру з одним із шаблонів буде виконано відповідний список команд command-list. У квадратних дужках ([| pattern2 ...]) зазначені додаткові варіанти розділені символом (|) які може приймати parameter крім основного. Закінчується список шаблонів дужкою. Більш зрозумілою структура цього оператора стане після розгляду прикладу:
case $ i in
-d |-c) mkdir dir1
echo "directory dir1 was created";;
-r) rmdir dir1
echo "directory dir1 was removed";;
*) Echo "invalid option";;
esac
У цьому прикладі скрипт отримавши при запуску один з аргументів-d чи-c спробує створити директорію з ім'ям dir1, отримавши аргумент-r спробує її стерти. У всіх інших випадках (шаблон *) він видасть попередження про неправильний аргумент.
Примітка: Зверніть увагу на те що порядок проходження гшаблонов в операторі case має велике значення. Так якщо рядок
*) Echo "invalid option";;
поставити в самий початок, то на ній буде весь час термініроваться скрипт.
Команда. (точка)
Кожного разу коли Ви запускаєте шелл програми, створюється ще одна копія шелла в якій вони виконуються. Тому якщо Ви написали шелл скрипт, то всі змінні "живуть" тільки під час виконання скрипта. Якщо ви хочете, щоб всі змінні з шелл програми були у вашому поточному оточенні запускати скрипт потрібно в поточному Шелі, це досягається використанням команди. (точка).
. scriptname
Команда eval
eval [arg ...]< br />
Аргументи читаються і з'єднуються в одну команду. Потім ця команда виконується Шеллі і статус виходу команди повертається як результат команди eval. Якщо аргументи в команді відсутні або порожні то команда повертає нульовий статус.
Як приклад розглянемо два скрипта:
d = 'date &'; $ d
і
d = 'eval date &'; $ d
перший з них не виконається так як команда date сприйме символ & як аргумент а не як ознака запуску у фоновому режимі, в результаті чого перші скрипт не виконається на відміну від другого.
Використання метасимволів.
У всіх конструкціях циклів і операторі case можливе використання метасимволів. Наприклад скрипт з прикладу оператора циклу for
for i in `ls a *`
do
cp $ i/tmp
echo "$ i was copied"
done
можна переписати в більш простому вигляді
for i in a *
do
cp $ i/tmp
echo "$ i was copied"
done
результат буде один і той же.
2.3.1 Деякі спеціальні команди
Роздільники & & та | |
Це умовні роздільники. При розподілі двох команд за допомогою & & друга команда виконається лише в тому випадку коли перший завершиться успішно. При поділі команд за допомогою | | друге виконається лише тоді коли перша закінчилася неуспішне (код повернення не дорівнює нулю).
Наприклад при виконанні скрипта:
test-d/usr/tools & & cd/usr/tools
test-d/usr/tools | | echo "directory doesn't exist"
вхід в директорію/usr/tools буде вироблений тільки при її наявності, в іншому випадку буде видане повідомлення про її відсутність.
Визначення функцій
Для скорочення обсягу шелл програм і спрощення їх розуміння і сопровжденія шелл допускає введення і використання функцій. Для опреденія функції використовується наступний синтаксис:
name () (list;)
де name - це ім'я функції, а list - список команд з яких складається тіло функції. Нижче наведено приклад функції повертає 0 якщо аргумент переданий їй є каталогом і 1 в іншому випадку.
dir_test () (
if [-d $ 1]
then
echo "$ 1 is a directory"
return 0
else
echo "$ 1 is not directory"
return 1
fi;
)
виклик функції здійснюється в такий спосіб
name [parameter ...]
наприклад в нашому випадку це можна зробити так
dir_test/usr/bin/sh
Перенаправлення вводу-виводу
Як було сказано вище для перенаправлення вводу-виводу використовуються символи (> перенаправлення виводу,>> перенаправлення виведення з додаванням у файл і <перенаправлення вводу). Крім цього існує ще ряд конструкцій, один з яких:>
при цьому всі лінії від першої і до містить рядок word будуть використовуватися як вхідні дані. Наприклад:
$ Cat These words will be printed
> The cat command until the "mark"
> Word is found
> Mark
These words will be printed
the cat command until the "mark"
word is found
$
Якщо перед рядком word стоїть мінус то всі символи табуляції на початку рядків будуть вирізані.
Інший часто використовується конструкцією при перенаправлення вводу-виводу є:
> & Цифра
При цьому задіюється файловий дискриптор асоційованим з вказаної цифрою. У більшості програм із стандартним вводом пов'язаний дискриптор 0, із стандартним виводом дискриптор 1, і зі стандартним потоком помилок дискриптор 2. Всі програми які працюють один з одним через пайпи за замовчуванням пользуються дискриптора 0 і 1. Найбільш часто використовувані перенаправлення це 1> & 2 і 2> & 1. Наведемо приклад з якого стане зрозумілий зміст цих конструкцій:
$ Ls/no/such/file> out
/ no/such/file not found
$ Cat out
$
$ Ls/no/such/file> out 2> & 1
$ Cat out
/ no/such/file not found
$
перша команда намагається вивести лістинг НЕ суцествующего файлу перенаправивши стандартний вивід в файл out. Файл out при цьому оказивется порожнім тому повідомлення про помилку виводиться у стандартний потік помилок і з'являється на терміналі. Друга команда об'єднує стандартний потік помилок зі стандартним висновком який перенаправлений в файл out. При цьому повідомлення про помилку потрапляють у файл, про що свідчить команда cat.
Команда exec
exec [arg ...]
Ця команда виконує заміщення поточного Шела новим шолом або програмою. Різниця між простим запуском Шелаєв та запуском через exec стає очевидною на наступному прикладі:
$ Ksh
$ Ps
PID TTY TIME COMMAND
2125 pts/0 0:00 ksh
2094 pts/0 0:00 sh
2126 pts/0 0:00 ps
$
$ Exec ksh
$ Ps
PID TTY TIME COMMAND
2127 pts/0 0:00 ps
2094 pts/0 0:00 ksh
$
Команда expr
expr expression (+, -, *, /, *, =,>,> =,). Перенаправлення можливо лише з використанням операції>!
$ notify Якщо змінна встановлена то посилати немендленние повідомлення після закінчення фонових процесів
$ path Шлях для пошуку виконуваних файлів. При зміні цієї змінної потрібно повідомити шелл виконавши команду rehash
$ prompt Вид системної підказки
$ status Код повернення самої останньої команди
Цифрові змінні csh
Команда at (@) призначає цифровий змінної арифметичне значення, так само як і команда set призначає значення стороковой змінної. Значним цифрових змінних є десяткові цілі.
% @ Sum = (1 + 2)
% Echo $ sum
3
Основні арифметичні операції в csh
Операція Опис
() Дужки змінюють порядок виконання операцій
+ Додавання
- Віднімання
* Множення
/ Ділення
% Ділення
Основні логічні операції в csh
Операція Опис
== Перевірка на рівність
! = Пооверка на нерівність
! Логічне заперечення
Крім цих операцій є ще ряд логічних операцій які повинні бути взяті в дужки і їх операнди повинні ьить розділені пробілами у вигляді (operand1> = operand2)
Операція Опис
> Більше
<Менше>
> = Більше або дорівнює
>> Правий бітовий зсув
& Бітів і
| Бітів або
& & Логічне І
| | Логічне АБО
Наприклад:
% @ R = (2
% Echo $ r
32
Основні операції привласнення в csh
Операція Опис
= Просте рісвоеніе а = b
+ = A = a + b
-= A = a - b
*= A = a * b
/ = A = a/b
% = A = a% b
Постфіксние операції
До останніх відносяться операції + + і -
% @ A = 10
% @ A + +
% Echo $ a
11
Основні файлові операції
Виражений в csh можуть повертати значення в залежності від наявності або відсутності файлу, прав доступу до нього, тощо Для цього використовується наступний синтаксис:
-file_test filename
де file_test і filename можуть приймати наступні значення
file_test опис
d Чи є файл директорією?
e Чи існує файл?
f Це звичайний файл?
o Чи є я його власником?
r Мають