|> | Перенаправлення виводу в файл | program> out_file |
|>> | Перенаправлення виводу у файл з | Program>> |
| | Додаванням | out_file | p>
Пайп. Дві або більше програм можуть бути об'єднані таким чином щорезультат однієї програми потрапить на вхід інший. При цьому дані від однієїпрограми до іншої прямують через програмний канал, наприклад: p>
program1 | program2 | program3 p>
або більш реалістичний приклад: p>
ls-l/etc | more p>
Примітка: пайпи завжди працюють лише в одному напрямку - зстандартного виходу однієї до стандартного входу іншої програми. p>
Розширення імен файлів. p>
З метою зменшення кількості набраних символів під час введення імен файлів йшовпідтримує метасимволи. Нпрімер для того, щоб вивести лістинг всіхфайлів у поточній директорії імена яких починаються на літеру a доситьскористатися командою ls-la * p>
нижче наведена таблиця основних метасимволів p>
| Метасимволи | Опис |
| * | Чи означає будь-який символ в будь-якій кількості |
| ~ | Чи означає шлях до домашнього каталогу |
|? | Будь-який символ в кількості один або більше |
| [...] | Рівність будь-якого одного з символів ув'язнених |
| | В дужки. Пара символів розділена знаком |
| | Мінус означає будь-який символ з проміжку між |
| | Ними. Наприклад [a-zA-Z] - любаялатінская буква | p>
5. Shell скрипти p>
Виконання скриптів. P>
Кілька команд обьедененних однією послідовністю виконанняназивається скриптом. Наприклад послідовне виконання команд, пайпиє простими скриптами. Зазвичай команди з яких складаються скриптизберігають у файлах. Для запуску скрипта можна скористатися двомаметодами: p>
sh p>
або встановити атрибут виконуваності на файл командою p>
chmod + x p>
Після чого можна виконувати скрипт: p >
./ p>
Виведення тексту. p>
Для формування висновку текстової інформації в скриптах використовують команду p>
echo "рядок" p>
Файл. profile. p>
Кожного разу під час входу в систему Bourne Shell автоматично запускаєфайл. profile (скрипт) знаходиться у вашій домашній директорії. Цей скриптвстановлює "оточення" в якому Вам має працювати. Це різнізмінні оточення відповідають за вид системної підказки, шлях пошукувиконуваних файлів, тип терміналу т.п. Наведемо список основнихзмінних оточення. p>
. PATH встановлює шлях пошуку файлів, що виконуються і являє собою набір директорій розділених двокрапкою
. MAIL визначає ім'я файлу поштової скриньки для повідомлення про прихід нової електронної пошти
. MAILCHECK параметр показує як часто (в секундах) слід перевіряти поштову скриньку на предмет приходу нової пошти
. HOME визначає домашній каталог (каталог за замовчуванням). Команда cd без параметрів виконує перехід в цей каталог.
. PS1 основна системна підказка (по промовчав $)
. PS2 вторинна системна підказка (за замовчуванням>)
. SHELL ім'я логін шелла користувача
. TERM тип терміналу користувача
. EDITOR ім'я текстового редактора за замовчуванням p>
Встановлювати змінні оточення можна по різному. Наприклад команди p>
PATH =/bin:/usr/bin:/usr/sbin:/usr/contrib/bin:/usr/local/bin p>
і p> < p> PATH =/bin:/usr/bin:/usr/sbin p>
PATH = $ PATH::/usr/contrib/bin:/usr/local/bin p>
повністю еквівалентні. Для того щоб ці змінні увійшли в системнеоточення (крім Шела, стали доступні і інших програм) необхідновиконає команду p>
export p>
Коментарі. p>
Текст наступний за символом # розглядається шолом як коментар і немає жодного впливу на роботу скрипта. p>
Основи програмування на мові shell p>
Параметри. P>
На додаток до стандартних параметрах Шела можна створювати свої параметри,кторые потім можна використовувати в командах. Наприклад p>
$ x = test p>
$ echo $ x test p>
$ aaa =/ p>
$ ls $ aaa p>
cdrom home nsmail tcb var p>
SD_CDROM dev lib opt tmp p>
TT_DB etc lost + found sbin tmp_mnt p>
Bin export net stand usr p>
При включенні параметрів в рядок або в вираз знак $ повиненпередувати параметру. Також необхідно користуватися наступнимиправилами: p>
$ (parameter) значення параметра укладеного в дужки буде використано у виразі. Дужки () використовуються коли за параметром дотримуються букви або цифри не пов'язані з парамаметру. Наприклад, якщо значення параметра xxx одно test то значення виразу $ (xxx) 123 буде дорівнювати test123 p>
$ (parameter:-word) якщо параметр встановлений і не порожній то результатом виразу буде значення параметра, в іншому випадку в результаті буде використано значення параметра word. Наприклад: $ (xxx: -/usr/bin/sh) якщо xxx порожній то результатом виразу буде рядок p>
/usr/bin/sh p>
$ (parameter: = word) якщо параметр невстановлені або порожній, тоді значення word буде результатом вираження.
$ (parameter: + word) якщо параметр встановлений і не порожній, тоді результатом вираження є word, в іншому випадку результат порожній. p>
Аргументи командного рядка. p>
Коли Ви запускаєте на виконання програми , Ви можете передавати їй одинабо більше аргументів. Шелл скрипти мають доступ до цих аргументівза допомогою параметрів $ 0, $ 1, $ 2 ... $ 9. Якщо аргументів більше дев'яти, їхзначення поміщаються в буферу і можуть бути доступні з використаннямкоманди shift яка буде обговорюватися нижче. Параметр $ 0 завжди березначення імені виконуваного файлу, $ 1 - перший аргумент командного рядка,
$ 2 - друга, тощо
Кількість аргументів командного рядка завжди можна дізнатися проаналізувавшипараметр $ #. У тому випадку, якщо Вам потрібен один параметр, що містить всіаргументи командного рядка розділені пробілом потрібно воспоьзоватьсяпараметром $ *.
Для отримання доступу до аргументів з номером більше дев'яти необхідноскористатися командою shift. Після чергового виконання команди shiftвідбувається зсув на один елемент у буферу параметрів у результаті якогозначення параметра $ 2 отримує параметр $ 1, значення параметра $ 3 отримує
$ 2, тощо Використовуючи цикл (цикл будуть рассвотрени нижче) у поєднанні зкомандою shift можна отримувати доступ до всіх аргументів командного рядка зномерами перевищують 9. p>
Квотінг. p>
Дуже часто трапляються ситуації коли необхідна особлива трактування тихсимволів які шелл сприймає як спец символи. Наприклад випадок колирядок тексту включаючи пробіли потрібно передати як один аргумент або знак $повинен не бути сприйнятий як покажчик на параметр. Для цих цілейвикористовується квотінг (quoting).
Наприклад символ бекслеша () можна використовувати для квотінга символу $. P>
$ param = aaa p>
$ echo $ param aaa p>
$ echo $ param p>
$ param p>
У поєднанні з бекслешем для квотінга можна використовувати подвійні лапки.
Наприклад: p>
echo "$ param is a" new directory "" aaa is a "new directory" p>
При цьому знак $ всередині подвійних лапок інтерпретується як покажчик напараметр а бекслеш використовується для "захисту, в" внутрішніх лапок. p>
Одинарні лапки також можна використовувати для квотінга але на відміну відподвійних вони "екранують" все що знаходиться всередині них. Різниця одразустає зрозумілою після заміни в попередньому прикладі подвійних лапокодніранимі: p>
$ echo '$ param is a "new directory"' p>
$ param is a "new directory" p>
Підстановка команд. p>
Символ зворотного наголосу ( `) використовується в скриптах вказує напідстановку команд. Це має на увазі що результат виводу командипідставляється в шелл як параметр. Нпрімер: p>
$ echo "The current date is` date `" p>
The current date is Sat Jan 6 04:16:35 GMT 2001 p>
або
$ users = `who` p>
$ echo "Users currentrly logged in the system: n $ users" p>
Users currentrly logged in the system: root console Jan 6 03:57 roman pts/0 Jan 5 23:12 p>
Умови. p>
Дуже часто трапляються ситуації при написанні скриптів коли необхідновиконувати ті чи інші команди в залежності від конкретних умов.
Наприклад, потрібно відсортувати файл, а в разі його відсутності вивестиповідомлення про помилку. На цей випадок шелл має умовний оператор, ізазначена завдання вирішується з його використанням в такий спосіб: p>
if test-f $ 1 then sort $ 1 else echo "file $ 1 doesn't exist" fi p>
Умовний оператор має наступний синтаксис: p>
if then elif then p>
... .. else fi p>
Оператор if перевіряє статус виконаної команди (у даному прикладі test
-F)
І в разі успіху (програма повертає 0) виконує команди стоять післяthen, в іншому випадку виконуються команди else/elif. p>
Найбільш часто використовується командою в оператореусловія є командаtest. Вона має безліч опцій, повний список яких можна отриматизвернувшись до її документації виконавши команду man test.Очень часто замістькоманди test використовують команду [яка є її фунуціональниманалогом. Тут наводиться лише короткий список основних опцій команди test. P>
-r file повертає успіх якщо файл існує і доступний длячитання. p>
-w file повертає успіх якщо файл існує і доступнийдля запису. p>
-x file повертає успіх якщо файл існує іщо виконується. p>
-f file повертає успіх якщо це регулярний файл. p>
-d file повертає успіх якщо це директорія. p>
-c file повертає успіх якщо це спеціальний файл. p>
-s file повертає успіх якщо файл має ненульовийрозмір. p>
-h file повертає успіх якщо це сімлінка. p>
-z s1 повертає успіх якщо довжина рядка s1нульова. p>
-n s1 повертає успіх якщо довжина рядка s1 ненульова. p>
s1 = s2 перевірка двох рядків на рівність. p>
s1! = s2 перевірка двох рядків на нерівність p>
s1 повертає успіх якщо рядок s1 непорожній p>
n1-eq n2 Алгебраїчна перевірка двох чисел n1 і n2 на рівність. Крім-eq є ще ряд опцій для алгебраїчного порівняння такі як-ne,-gt,-ge, ... p>
Всі перераховані вище умови можуть обьеденяться з використаннямлогічних операторів: p>
! заперечення p>
-a Бінарний І p>
-o Юінарний АБО (-а має пріоритет більший ніж-о) p>
(expr) Угрупування виразів дужками p>
Введення даних. P>
Для введення іданних в скрипт можна скористатися командою p>
read [parameter ...] p>
яка в якості аргументів приймає список з одного або більшепараметрів. p>
Примітка: знак $ перед іменем параметра в команді read ставити не потрібно. p>
Цикли. p>
Дуже часто при складанні скриптів простого послідовного виконаннябуває недостатньо. Необхідні механізми, які дозволяли б виконуватикоманди з змінними параметрами. Для цих цілей шелл надає врозпорядження три ціклічекіе конструкції: цикли for, while та untill. p>
Цикл for p>
Цей тип циклів дозволяє виконувати один і той же набір команд кожного разу зновими значеннями отриманими зі списку параметрів. Він має наступнийформат: p>
for parameter [in wordlist] do command-list done p>
де parameter це будь-яке ім'я параметра, wordlist - один або декільказначень послідовно привласнюються параметру, command-list - набіркоманд які виконуються при кожному проході циклу. wordlist може бути абопросто набором аргументів розділених пробілом, або командою шелла якагенерує сама аргументи. Наприклад наступний код: p>
for i in 1 2 3 4 5 do if mkdir $ i then echo "directory $ i was created" fi done p>
створює послідовно директорії з іменами 1 2 3 4 5 і у разі успішногостворення директорії видає повідомлення. Наступний скрипт: p>
for i in `ls a *` do cp $ i/tmp echo "$ i was copied" done p>
копіює всі файли що починаються на літеру a з поточного каталогу в каталог
/ tmp. p>
Цикл while p>
while command-list1 do command-list2 done p>
цей цикл запускає команди зі списку command-list1, і якщо останнякоманда зі списку виконали успішно (код повернення дорівнює 0) то починаютьвиконуватися команди зі списку command-list2, у противному випадку циклзакінчується. Цикл з такого прикладу: p>
while [-r $ 1] do echo "processing $ 1" cat $ 1>> summary shift done p>
по черзі зчитує аргументи командного рядка, у разі коли в поточномукаталозі присутній файл доступний на читання з ім'ям збігається з цимаргументом, вміст цього файлу дописується до файлу з ім'ям summary. УІнакше, скрипт припиняє свою роботу. p>
Цикл util p>
until command-list1do command-list2done p>
конструкція цього циклу повністю аналогічна циклу while за виняткомтого що тіло циклу (набір команд command-list2) виконується як мінімумодин раз не залежно від успішності виконання умови циклу (набір командcommand-list1). p>
Оператор case p>
Оператор case є розширенням стандартного умовного оператора if.
Якщо є умова при якому може реалізовуватися безліч варіантів тозамість серії операторів if краще використовувати один case. p>
case parameter inpattern1 [| pattern2 ...]) command-list1;;pattern2 [| pattern3 ...]) command-list2;;
...esac p>
шаблони pattern визначають варіанти параметра parameter. При збігупараметра з одним із шаблонів буде виконано відповідний список командcommand-list. У квадратних дужках ([| pattern2 ...]) зазначені додатковіваріанти розділені символом (|) які може приймати parameterкрім основного. Закінчується список шаблонів дужкою. Більш зрозумілоюструктура цього оператора стане після розгляду прикладу: p>
case $ i in p>
-d |-c) mkdir dir1 echo "directory dir1 was created";; p>
-r) rmdir dir1 echo "directory dir1 was removed";; p>
*) echo "invalid option";; esac p>
У цьому прикладі скрипт отримавши при запуску один з аргументів-d або-cспробує створити директорію з ім'ям dir1, отримавши аргумент-rспробує її стерти. У всіх інших випадках (шаблон *) він видастьПопередження про неправильному аргумент. p>
Примітка: Зверніть увагу на те що порядок проходження гшаблонов воператорі case має велике значення. Так якщо рядок p>
*) echo "invalid option";; p>
поставити в самий початок, то на ній буде весь час термініроваться скрипт. P>
Команда. (точка) p>
Кожного разу коли Ви запускаєте шелл програми, створюється ще одна копіяшелла в якій вони виконуються. Тому якщо Ви написали шелл скрипт, товсі змінні "живуть" тільки під час виконання скрипта. Якщо ви хочетещоб всі змінні з шелл програми були у вашому поточному оточеннізапускати скрипт потрібно в поточному Шелі, це досягається використаннямкоманди. (точка). p>
. scriptname p>
Команда eval eval [arg ...] p>
Аргументи читаються і з'єднуються в одну команду. Потім ця командавиконується Шеллі і статус виходу команди повертається як результаткоманди eval. Якщо аргументи в команді відсутні або порожні то командаповертає нульовий статус.
Як приклад розглянемо два скрипта: p>
d = 'date &'; $ dі d = 'eval date &'; $ d p>
перший з них не виконається так як команда date сприйме символ & якаргумент а не як ознака запуску у фоновому режимі, в результаті чогоперший скрипт не виконається на відміну від другого. p>
Використання метасимволів. p>
У всіх конструкціях циклів і операторі case можливе використанняметасимволів. Наприклад скрипт з прикладу оператора циклу for p>
for i in `ls a *` do cp $ i/tmp echo "$ i was copied" done p>
можна переписати в більш простому вигляді p> < p> for i in a * do cp $ i/tmp echo "$ i was copied" done p>
результат буде один і той же. p>
2.3.1 Деякі спеціальні команди p>
Роздільники & & та | | p>
Це умовні роздільники. При розподілі двох команд за допомогою & & другукоманда виконається лише в тому випадку коли перший завершиться успішно. Приподілі команд за допомогою | | друге виконається лише тоді коли першізакінчилася неуспішне (код повернення не дорівнює нулю).
Наприклад при виконанні скрипта: p>
test-d/usr/tools & & cd/usr/tools p>
test-d/usr/tools | | echo "directory doesn't exist"
вхід в директорію/usr/tools буде вироблений тільки при її наявності, вІнакше буде видане повідомлення про її відсутність. p>
Визначення функцій p>
Для скорочення обсягу шелл програм і спрощення їх розуміння і сопровжденіяшелл допускає введення і використання функцій. Для опреденія функціївикористовується наступний синтаксис: p>
name () (list;) p>
де name - це ім'я функції, а list - список команд з яких складається тілофункції. Нижче наведено приклад функції повертає 0 якщо аргументпереданий їй є каталогом і 1 в іншому випадку. p>
dir_test () (if [-d $ 1] then echo "$ 1 is a directory" return 0 else echo "$ 1 is not directory" return 1 fi;
) p>
виклик функції здійснюється таким чином p>
name [parameter ...] p>
наприклад в нашому випадку це можна зробити так p>
dir_test/usr/bin/sh p>
Перенаправлення вводу-виводу p>
Як було сказано вище для перенаправлення вводу-виводу використовуютьсясимволи (> перенаправлення виводу,>> перенаправлення виведення з додаванняму файл і <перенаправлення вводу). Крім цього існує ще рядконструкцій, один з яких: p>
word is found p>
> mark p>
These words will be printed the cat command until the "mark" word is found p>
$ p>
Якщо перед рядком word стоїть мінус то всі символи табуляції на початкустрок будуть вирізані. p>
Інший часто використовується конструкцією при перенаправлення вводу-виводує: p>
& цифра p>
При цьому задіюється файловий дискриптор асоційованим з вказаноїцифрою. У більшості програм із стандартним вводом пов'язаний дискриптор 0,зі стандартним виводом дискриптор 1, і зі стандартним потоком помилокдискриптор 2. Всі програми які працюють один з одним через пайпи позамовчуванням пользуються дискриптора 0 і 1. Найбільш часто використовуваніперенаправлення це 1> & 2 і 2> & 1. Наведемо приклад з якогостане зрозумілий зміст цих конструкцій: p>
$ ls/no/such/file> out p>
/no/such/file not found p>
$ cat out p>
$ p>
$ ls/no/such/file> out 2> & 1 p>
$ cat out p>
/no/such/file not found p>
$ p>
перша команда намагається вивести лістинг НЕ суцествующего файлу перенаправившистандартний вивід в файл out. Файл out при цьому оказивется порожнім томуповідомлення про помилку виводиться у стандартний потік помилок і з'являється натерміналі. Друга команда об'єднує стандартний потік помилок зстандартним висновком який перенаправлений в файл out. При цьому повідомлення пропомилку потрапляють у файл, про що свідчить команда cat. p>
Команда exec exec [arg ...] p>
Ця команда виконує заміщення поточного Шела новим шолом або програмою.
Різниця між простим запуском Шелаєв та з