Короткий опис командного інтерпретатора Shell
Серед операційних систем особливе місце займає Unix. Unix може працювати практично на всіх платформах. Unix - це стандарт де факто відкритих мобільних операційних систем.
Це не тільки багатозадачна операційна система, але й багатокористувацька система. Вона забезпечує сучасний користувацький інтерфейс на базі системи X Window та міжплатформенний зв'язок на базі протоколів TCP/IP і т.д.
ОС Unix створена Кеном Томпсоном та Денісом Рітчі в Bell Laboratories (AT&T).
ОС Unix стоїть на 3-х китах: мова Сі, файлова система, командна мова. Потім додалася система X Window та протоколи TCP/IP.
Мова Сі, на якій написана операційна система Unix, з одного боку, включає в себе властивості мови високого рівня програмування: опис типів, програмні структури if, for, while і т.п., а з іншого боку - включає засоби, що властиві мовам низького рівня програмування, рівня асемблера: регістрові змінні, адресну арифметику, можливості роботи з полями біт та окремими бітами і т.п.
Найпростіші засоби SHELL
Командна мова shell фактично є мовою програмування дуже високого рівня. Цією мовою користувач здійснює управління комп'ютером. Загалом, після входження в систему користувач починає взаємодіяти з командною оболонкою. Ознакою того, що оболонка (shell) готова до прийому команд слугує спеціальний символ, який вона виводить на екран, найчастіше це $.
Shell не є необхідною та єдиною командною мовою, але хоча вона стандартизована в межах POSIX - стандарт мобільних систем.
Shell - це одна з багатьох команд Unix. Тобто в набір команд оболонки входить команда "sh" - виклик інтерпретатора "shell". Перший "shell" викликається автоматично під час входження в систему і видає на екран промптер. Після цього можна викликати на виконання будь-які команди, у тому числі і знову "shell", який створює нову оболонку всередині попередньої.
Так наприклад, якщо підготувати в редакторі файл "f1":
echo Hello!
то це буде звичайний текстовий файл, що вміщує команду "echo", яка під час виконання виводить все, що написане правіше неї на екран. Можна зробити файл "f1" виконавчим за допомогою команди "chmod 755 f1". Але його можна викликати явно, використавши виклик інтерпретатора shell:
sh f1
Файл можна виконати і поточному екземплярі "shell". Для цього існує специфічна команда ".".
Структура команд.
Команди в shell загалом мають наступний формат:
<ім'я команди> <прапорці> <аргумент(и)>
Наприклад: ls -ls /usr/bin
ls | ім'я команди виведення вмісту директорії, |
-ls | прапорці ("-" - ознака прапорця, l - довгий формат, |
s - об'єм файлів в блоках), | |
/usr/bin | директорії, для яких виконується команда. |
Ця команда виводить на екран в довгому форматі вміст директорії /usr/bin, при цьому додає інформацію про розмір кожного файлу в блоках.
Як правило, перше слово в команді shell сприймає як команду.
Групування команд.
Засоби групування:
; та #10#13 | визначають послідовність виконання команд; |
& | асинхронне (фонове виконання) попередньої команди; |
&& | виконання наступних команд за умови нормального |
завершення попередньої, інакше ігнорувати; | |
|| | виконання наступних команд якщо попередня |
завершилася не нормально, інакше ігнорувати. |
<p> Під час виконання команди в асинхронному режимі (після команди стоїть один амперсанд) на екран виводиться номер процесу, що відповідає виконуваній команді, та система, запустивши цей фоновий процес, знову виходить в діалог з користувачем.
Інколи необхідно, щоб усі фонові процеси завершили свою роботу, перед тим як буде виконуватися якийсь розрахунок. Для цього слугує команда "wait [PID]". Ця команда чекає завершення вказаного ідентифікатором фонового процесу. Якщо команда без параметру, то вона чекає завершення усіх фонових процесів, дочірніх для даного "sh".
Для групування команд також можуть використовуватися фігурні "\{\}" та круглі "()" дужки.
Фонові процеси важко знищити, так як традиційна команда "CTL/C" перериває тільки процеси переднього плану. Для знищення фонового процесу необхідно знати його номер. Під час запуску фонового \cite{kristian} процесу на екран виводиться число, що відповідає ідентифікатору цього процесу (PID). Якщо цей номер загублений, або треба побачити, що процес закінчив свою роботу за допомогою команди: ps -aux. Знайшовши потрібний PID необхідно використати наступну команду для знищення процесу: kill -9 [PID].
Круглі дужки "()", крім виконання функцій групування, виконують також функцію виклику нового екземпляру інтерпретатора shell. Нехай поточний каталог: "/mnt/lab/asu". Тоді в послідовності команд: cd..; ls; ls - дві команди "ls" виведуть 2 екземпляра вмісту каталогу "/mnt/lab", а послідовність (cd ..; ls) ls - виведе спочатку вміст каталогу "/mnt/lab", а потім вміст "/mnt/lab/asu", таким чином під час входження в дужки викликається новий екземпляр shell, в межах якого і здійснюється перехід. Під час виходу із круглих дужок відбувається повернення в старий shell та в старий каталог.
Генерація імен файлів.
Під час генерації використовують метасимволи:
* | будь-яка послідовність символів, можливо порожня; | |
? | один будь-який символ; | |
[. . .] | будь-який символ, вказаний в дужках перерахуванням | |
та/або з указанням діапазону; | ||
cat f* | виводить усі файли поточного каталогу, імена яких | |
розпочинаються з "f"; | ||
cat *f* | виводить усі файли, імена яких містять "f"; | |
cat | виводить файли даного каталогу з однобуквенним | |
розширенням; | ||
program.? | видасть файли даного каталогу, що розпочинаються | |
на program, з однобуквенним розширенням; | ||
cat [<b>a-b<b>] | видасть файли, які розпочинаються с "a", "b", "c", "d". | |
Аналогічно cat [abcd] та cat [bdac]. | ||
</p>
СЕРЕДОВИЩЕ SHELL - ЗМІННІ ТА ПАРАМЕТРИ
Shell-змінні.
Ім'я shell-змінної - послідовність, що розпочинається з букви, та вміщує цифри, знак підкреслювання.
Значення shell-змінної - рядок символів.
У shell всього два типи даних: рядок символів та текстовий файл.
Ім'я змінної аналогічно традиційному представленню про ідентифікатор, тобто ім'ям може бути послідовність букв, цифр та підкреслювань, розпочинається з букви або підкреслення.
Для присвоювання значення змінним може використовуватися оператор присвоювання "=".
var_1=13 var_2="OS Unix"
Змінна та її значення повинні бути записані без пробілів відносно символа "=".
Можливі й інші способи присвоювання значення shell-змінним. Так, наприклад: DAT=`date` приводить до того, що спочатку виконується команда "date" а результат її виконання, замість видачі на стандартний вихід, прописується у якості значення змінної, у даному випадку "DAT".
Можна надати значення змінної за допомогою команди "read", яка забезпечує прийом значення з клавіатури: read x.
Одна команда "read" може прочитати значення відразу для декількох змінних, по черзі. Якщо змінних більше, чим їх введено, то тим що залишилися змінним присвоюється порожній рядок, якщо введено більше, то зайві значення ігноруються.
Під час звернення до shell-змінної необхідно перед ім'ям ставити символ "\$", так відповідно команда echo $var_2; виведе на екран "OS Unix".
Екранування.
Як засоби екранування використовуються подвійні лапки (""), одинарні лапки (' ') та бек-слеш (\).
Можна в одному рядку записувати декілька присвоювань.
x=22 y=33 z=$x A="$x" B='$x' C=\$x D="$x + $y + $z" E='$x + $y + $z' F=$x\ +\ $y\ +\ $z
Тоді
echo A = $A B = $B C = $C echo D = $D E = $E F = $F eval echo evaluated A = $A eval echo evaluated B = $B eval echo evaluated C = $C
виведуть на екран
A = 22 B = $x C = $x D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22 evaluated A = 22 evaluated B = 22 evaluated C = 22
"eval" - команда, що виконує означення змінних в рядку, що є аргументом.
Бек-слеш не тільки екранує наступний за ним символ, що дозволяє використовувати спеціальні символи просто як символи, що представляють самих себе, він може екранувати сам себе. Цей символ також може створювати ефект продовження рядка. Ефект продовження командного рядка забезпечує також символ конвеєра - "|".
Маніпулювання зі змінними.
Не дивлячись на те, що shell-змінні в загальному випадку сприймаються як рядки, тобто "35" - це не число, а рядок із двох символів, інколи можуть інтерпретуватися як цілі числа.
Різні можливості має команда "expr".
Виконання командного файлу:
x=7 y=2 a=`expr $x + $y` ; echo a=$a a=`expr $a + 1` ; echo a=$a b=`expr $y - $x` ; echo b=$b c=`expr $x '*' $y` ; echo c=$c d=`expr $x / $y` ; echo d=$d e=`expr $x % $y` ; echo e=$e
видасть на екран
a=9 a=10 b=-5 c=14 d=3 e=1
Операція множення (" * ") обов'язково повинна бути заекранована, так як в shell цей символ сприймається, як спеціальний символ, що означає будь-яку послідовність символів. Також повинні бути в обов'язковому порядку пробіли.
Якщо змінні, нехай "x", "y", "z", не визначені, то під час звернення до змінних
${x-new} | у якості значення "x" буде видано "new", |
${y=new} | у якості значення "y" буде присвоєно "new", |
${z?new} | у якості значення "z" буде видано "z: new". |
У всіх вище описаних випадках, якщо змінна була до цього часу визначена, то її значення використовується звичайним чином.
Параметри.
У командний файл можуть бути передані параметри. У shell використовуються позиційні параметри (тобто істотна послідовність їх слідування). У командному файлі змінні, що відповідають параметрам, імена розпочинаються зі знаку $, а далі номер від 0 до 9.
\$0 | відповідає імені даного командного файлу; |
$1 | перший по порядку параметр; |
$2 | другий параметр і т.д. |
Для передачі великої кількості параметрів використовується спеціальна команда "shift". У результаті першого застосування цієї команди, другий параметр викликається як $1, третій параметр як $2, ... десятий параметр, який був недоступній, викликається як $9. Але став недоступний 1-й параметр - ім'я файлу.
Команда "set" встановлює значення параметрів. Це буває дуже зручно: set a b c. Так наприклад, команда "date" виводить на екран поточну дату, тоді наприклад:
set `date` echo $1 $3 $5
виведе на екран:
Mon 01 2000
<p> Команда "set" дозволяє також здійснювати контроль виконання програми, наприклад:
set -v | на термінал виводяться рядки, що читаються shell; |
set +v | відміняється попередній режим; |
set -x | на термінал виводяться команди перед виконанням; |
set +x | відміняється попередній режим. |
Команда "set" без параметрів виводить на термінал стан програмного середовища.
Програмне середовище.
Команда "set" без параметрів виведе на термінал щось подібне:
HOME=/home/sae PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11: IFS= LOGNAME=sae MAIL=/var/spool/mail/sae PWD=/home/sae/STUDY/SHELL PS1=${PWD}:" " PS2=> SHELL=/bin/bash TERM=linux TERMCAP=console|con80x25|dumb|linux:li:co: UID=501 perem=stroka x=5
<p> Звернення до елементів даного середовища відбувається таким чином: ${ім'я змінної}.
Сам інтерпретатор автоматично присвоює значення наступним змінним:
? | значення, що повернулося останньою командою; |
\$ | номер процесу; |
! | номер фонового процесу; |
# | число позиційних параметрів; |
* | перелік параметрів, як цілісного рядка; |
@ | перелік параметрів, як сукупність слів; | - | прапорці. |
Під час звернення до цих змінних треба спереду ставити "$".
ПРОГРАМНІ СТРУКТУРИ
Як і в будь-якій мові програмування у тексті мовою shell можуть бути коментарі. Для цього використовується символ "#". Усе, що знаходиться в рядку лівіше від даного символу, сприймається інтерпретатором як коментар.
Як і в будь-якій процедурній мові програмування, в мові shell є оператори. Ряд операторів дозволяє керувати послідовністю виконання команд. У таких операторах часто необхідна перевірка умови, яка визначає напрямок продовження обчислень.
Команда TEST ("[ ]").
Команда "test" перевіряє виконання деякої умови. З використанням цієї інтегрованої команди формуються оператори вибору та циклу мови shell.
Є два можливих формати команди: test умова або [ умова ].
Shell розпізнає цю команду відносно відкриваючої дужки: "[", як слову, що відповідає команді "test". Пробіли повинні бути між значеннями та символом порівняння або операції.
У shell використовуються умови різних "типів".
Умови перевірки файлів:
-f file | файл "file" є звичайним файлом; |
-d file | файл "file" - каталог; |
-c file | файл "file" - спеціальний символ; |
-r file | є дозвіл на читання файлу "file"; |
-w file | є дозвіл на запис у файл "file"; |
-s file | файл "file" не порожній. |
Умови перевірки рядків:
str1 = str2 | рядки "str1" та "str2" співпадають; |
str1 != str2 | рядки "str1" та "str2" не співпадають; |
-n str1 | рядок "str1" існує (не порожній); |
-z str1 | рядок "str1" не існує (порожній); |
Умови перевірки цілих чисел:
x -eq y | "x" рівне "y"; |
x -ne y | "x" не рівне "y"; |
x -gt y | "x" більше "y"; |
x -ge y | "x" більше або рівне "y"; |
x -lt y | "x" менше "y"; |
x -le y | "x" менше або рівне "y". |
Складні умови:
! | (not) інвертування значення коду завершення; |
-o | (or) відповідає логічному "або"; |
-a | (and) відповідає логічному "i"; |
Умовний оператор ("IF").
У загальному випадку оператор "if" має структуру:
if умова then список [elif умова then список] [else список] fi
Оператор вибору ("CASE").
Оператор вибору "case" має структуру:
case рядок in шаблон) список команд;; шаблон) список команд;; ... esac
"Рядок" (це може бути і один символ), що порівнюється із шаблоном. Потім "список
команд" вибраного рядка.Приклад:
echo -n " А какую оценку получил на экзамене?: " read z case $z in 5) echo Молодец ! ;; 4) echo Все равно молодец ! ;; 3) echo Все равно ! ;; 2) echo Все ! ;; *) echo ! ;; esac
Оператор циклу із перерахуванням ("FOR").
Оператор циклу "for" має структуру:
for ім'я [in список значень] do список команд done
де "for" - це службове слово, що визначає тип циклу, "do" та "done" - це службові слова, що виділяють тіло циклу. Фрагмент "in список значень" може
бути відсутнім.Оператор циклу з істиною умовою ("WHILE").
Оператор циклу "'while' має структуру:
while умова do список команд done
де "while" - службове слово, що визначає тип циклу з істиною умовою. Список команд у тілі циклу повторюється до тих пір, доки зберігається істинність умови (доки умови не дорівнює 0) або цикл буде перерваний командами "break", "continue"
або "exit".Оператор циклу з хибною умовою ("UNTIL").
Оператор циклу "until" має структуру:
until умова do список команд done
де "until" - службове слово, що визначає тип циклу з хибною умовою. Список команд в тілі циклу повторюється стільки разів, скільки буде зберігатися хибність умови
або цикл не буде перерваним спеціальними командами.Відмінність від "while" полягає в тому, що умова циклу перевіряється на хибність, перевіряється після кожного виконання тіла циклу.
Пустий оператор.
Пустий оператор має формат:
:
Нічого не робить. Повертає значення "0". Наприклад, в конструкції "while :" або ставить у початок командного файлу, щоб гарантувати, що файл не буде прийнятий
за виконавчий для "csh".Функції в shell.
Функції дозволяють підготувати список команд shell для наступного виконання.
Опис функції має вигляд:
ім'я() { список команд }
після чого звернення до функції відбувається за ім'ям. Під час виконання функції не створюється новий процес. Вона виконується в середовищі відповідального процесу. Аргументи функції стають її позиційними параметрами; ім'я функції - її нульовий параметр. Перервати виконання функції можна оператором "return [n]",
де "n" - код повернення.Приклад:
echo $$ fn() # опис функції { echo xx=$xx echo $# echo $0: $$ $1 $2 xx=yy ; echo xx=$xx return 5 } xx=xx ; echo xx=$xx fn a b # виклик функції "fn" з параметрами echo xx=$xx
Результат виконання даного скрипта буде:
749 xx=xx xx=xx 2 fun: 749 a b xx=yy xx=yy
Використано матеріали з веб-ресурсу: [1]
Микола Діхтяр, 07.02.2008 р.