Міністерство освіти і науки України
Національний університет Львівська політехніка
Звіт
до лабораторної роботи № 4
на тему: “Основи BASH”
Мета роботи
познайомитися з призначенням та основними можливостями оболонки bash;
познайомитися з основними правилами написання скріптів оболонки bash;
познайомитися з середовищем оболонки bash та правилами розкривання команд оболонки.
Виконання роботи
Bash (від англ. Bourne again shell, букв. перероджена Shell) — вдосконалена і модернізована варіація командної оболонки Bourne shell. Один з найпопулярніших сучасних різновидів командної оболонки UNIX. Особливо популярна в середовищі GNU/Linux, де воно часто використовується як командна оболонка за замовчуванням.
Bash це акронім Bourne-again-shell, тобто знов оболонка Bourne. Назва це гра слів на Bourne-shell — один з популярних різновидів командної оболонки для UNIX (sh), автором якої є Stephen Bourne (1978), вдосконалена в 1987 Brian Fox. Bourne (Бурн) перекликається з англійським словом «born», що означає що «народився», звідси: народжена-знов командна оболонка.
Синтаксис команд bash — це надмножина синтаксису команд Bourne shell. Остаточна специфікація синтаксису команд Bash є в Bash Reference Manual, що поширює проект GNU.
"hello world"
#!/bin/bash
echo Hello World!
Даний скрипт містить тільки два рядки. Перший повідомляє системі про те, яка програма використовується для запуску файлу. Другий рядок — це єдина дія, що виконується даним скриптом, він власне друкує 'Hello world' на терміналі.
Умовний оператор
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo умова виконується
else
echo умова не виконується
fi
Цикли
#!/bin/bash
for i in $( ls ); do
echo item: $i
done
#!/bin/bash
for i in `seq 1 10`;
do echo $i
done
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
Відмінний синтаксис
Переважна більшість важливих скриптів командного процесора Bourne можуть виконуватися без зміни в bash, за винятком тих скриптів Bourne, які посилаються на спеціальні змінні Bourne або використовують вбудовані команди Bourne. Синтаксис команд Bash включає ідеї, позичені в Korn shell (ksh) і C shell (csh), такі як редагування командного рядка, історія команд, стек директорії, змінні $RANDOM і $PPID, і синтаксис заміни команди POSIX : $(...) . Коли Bash використовується як інтерактивний командний процесор, він підтримує автозавершення імен програм, імен файлів, імен змінних тощо, якщо користувач натискає кнопку TAB.
Цілочисельна математика
Головне обмеження Bourne shell це те, що він не може виконувати обчислення з цілими числами без породження зовнішнього процесу . Bash може виконувати цілочисельні обчислення усередині процесу використовуючи команду ((...)) і синтаксис змінної $[...], як показано нижче:
VAR=55 # Встановлюємо змінну VAR, рівною 55
((VAR = VAR + 1)) # Додаємо одиницю до змінної VAR. Зверніть увагу на відсутність знаку '$'
((++VAR)) # Інший спосіб збільшення VAR на одиницю. Виконує префіксний інкремент
((VAR++)) # Інший спосіб збільшення VAR на одиницю. Виконує постфіксний інкремент
echo $[VAR * 22] # Множимо VAR на 22 і передаємо результат команді
echo $((VAR * 22)) # Інший спосіб зробити те ж
Команда ((...)) так само може використовуватися в умовних твердженнях, тому що її вихідний параметр це 0 або 1, які можуть інтерпретуватися як true або false:
if ((VAR == Y * 3 + X * 2)) then echo Yes
fi
((Z > 23)) && echo Yes
Команда ((...)) підтримує такі відносні оператори: '==' '!=', '>', '<', '>=', і '<='.
Bash не підтримує обчислення всередені процесу з числами з плаваючою крапкою. Тільки командні процесори Unix підтримують цю можливість Korn Shell (версія 1993 року ) і zsh (починаючи з версії 4.0).
Перенаправлення I/O
Bash має індивідуальний синтаксис перенаправлення, який не підтримує Bourne shell. Bash може перенаправляти стандартний вивід і стандартні помилки одночасно, використовуючи наступний синтаксис :
command &> file
що простіше набрати, ніж еквівалентну команду в синтаксисі Bourne shell
command > file 2>&1
Bash, починаючи з версії 2.05b, може перенаправляти стандартний ввод з рядка використовуючи наступний синтаксис (іноді званий "here strings"):
command <<< "string to be read as standard input"
Якщо рядок містить пробіли, він має бути поміщений в лапки.
Приклад:
Перенаправлення стандартного виводу у файл, запис даних, закриття файлу, скидання STDOUT
# make Filedescriptor(FD) 6 a copy of stdout (FD 1)
exec 6>&1
# open file "test.data" for writing
exec 1>test.data
# produce some content
echo "data:data:data"
# close file "test.data"
exec 1>&-
# make stdout a copy of FD 6 (reset stdout)
exec 1>&6
# close FD6
exec 6>&-
Відкриття і закриття файлів:
# open file test.data for reading
exec 6<test.data
# read until end of file
while read -u 6 dta
do
echo "$dta"
done
# close file test.data
exec 6<&-
Захоплення виведення зовнішніх команд:
# execute 'find' and store results in VAR
# search for filenames which end with the letter "h"
VAR=$(find . -name "*h")
Регулярні вирази всередині процесу
Bash 3.0 підтримує всередині процессниє регулярні вирази, з використанням наступного синтаксису, що нагадує Perl:
string =~ regex
Синтаксис регулярних виразів такий же, що і задокументований на сторінках документації regex. Статус виходу вищезазначеної команди 0 якщо перерахування regex це рядок, 1 якщо це не так. До введених підвиразів в регулярному виразі можна дістати доступ, використовуючи змінну командного процесора BASH_REMATCH, як показано нижче:
if abcfoobarbletch =~ 'foo(bar)bl(.*)'
then
echo The regex matches!
echo $BASH_REMATCH -- outputs: foobarbletch
echo ${BASH_REMATCH[1]} -- outputs: bar
echo ${BASH_REMATCH[2]} -- outputs: etch
fi
Цей синтаксис діє швидше, ніж виконаня команди grep, бо відповідний регулярний вираз міститься в межах процесу Bash. Якщо регулярний вираз або рядок містять пропуски або метасимволи (такі як '*' or '?'), вони повинні бути поміщені в лапки.
Розширення дужок
Можливість розширення дужок позичена в csh, вона дозволяє довільному ряку бути сформованим з використанням схожої техніки, як це робиться з назвами файлів. Проте в bash згенеровані рядки не зобов'язані бути іменами файлів. Результат кожного розширення рядка не сортується, зберігається порядок зліва направо:
# This is a bash specific feature
echo a{p,c,d,b}e # ape ace ade abe
Не треба використовувати цю особливість, якщо скрипт планується портувати, бо в традиційних скриптах розширення рядка не діятиме:
# A traditional shell does not produce the same output
echo a{p,c,d,b}e # a{p,c,d,b}e
Переносимість
Скрипти оболонок, написані зі специфічними для bash особливостями (bashism-и) не ьудуть відпрацьовувати на системах,де використовується Bourne shell або один з його замінників, без того, щоб bash був встановлений як додаткова оболонка, і звісно, скрипти треба починати з #!/bin/bash. Ця проблема стала особливо важливою, коли Ubuntu почав з жовтня 2006, поставляти Debian Almquist shell, dash, як скриптову оболонку за умовчанням, що призвело до числених недієздатних скриптів.
Висновок: в даній лабораторній роботі я вивчив основні команди BASH. Також ознайомився з базовими методами написання скріптів за допомогою даного середовища розробки скріптів для UNIX ОС. BASH це дуже потужне середовище для написання скріптів, тому що, по-перше, BASH на даний момент спортований на ряд провідних ОС. По-друге, один раз написаний скріпт можна використовувати повторно, що в свою чергу зменшує час який має затратити адміністратор/користувач терміналу для виконання поставлених завдань.