Bash
-
Медіафайли у Вікісховищі
|source model=
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», що означає що «народився», звідси: народжена-знову командна оболонка. Також має місце інша гра слів: «born again» — «народжений знову».
Синтаксис
Синтаксис команд bash — це надмножина синтаксису команд Bourne shell. Остаточна специфікація синтаксису команд Bash є в Bash Reference Manual [Архівовано 23 серпня 2011 у WebCite], що поширює проект 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
Функції
Оболонка підтримує механізм створення функцій. Після об'яви функції, її можна викликати як звичайну команду з таким самим способом передачі параметрів. Функції створюються наступним чином
[ function ] ім'я_функції () перелік_команд [перенаправлення]
де
- function — не обов'язковий оператор об'яви функції;
- ім'я_функції () — ім'я нової функції з обов'язковим додаванням дужок;
- перелік_команд — списком команд, які розміщені між фігурними дужками {}
Приклад функції, яка перевіряє чи є вказаний параметр шляхом до теки
chck_dir () { # оголошення локальної змінній в функції local dpath=$1 # якщо тека не існує - завершення роботи функції if [[ ! -d $dpath ]] then echo "файл $dpath не існує або не є текою" return 1 fi # перевіряємо чи користувач передав валідний шлях до директорії # якщо ні - завершуємо роботу if [[ ! -d "$1" ]] ; then echo "Шлях '$1' не існує. Будь ласка, уточнить." exit 1 fi } # Виклик функції chck_dir /home/usr001/record
Відмінний синтаксис
Переважна більшість важливих скриптів командного процесора 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).
Перенаправлення потоків
Bash має індивідуальний синтаксис перенаправлення потоків вводу/виводу, який не підтримує Bourne shell. Bash може перенаправляти стандартний потік виводу stdout
та стандартний потік повідомлень про помилки stderr
в один файл file
одночасно. Використовується наступний синтаксис:
command &> file
що простіше набрати, ніж еквівалентну команду в синтаксисі Bourne shell, яка спочатку перенаправляє потік stdout
у файл file
, а потім перенаправляє stderr
в той же потік, що і stdout
(1
та 2
тут номери стандартних потоків stdout
та stderr
відповідно):
command >file 2>&1
Bash, починаючи з версії 2.05b, може перенаправляти стандартний ввід stdin
на текст із рядка, використовуючи синтаксис, який іноді називають «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 ]]
Синтаксис регулярних виразів задокументовано на сторінках документації man 7 regex
. Статус виходу встановлюється в 0, якщо регулярний вираз збігся з рядком, і 1, якщо ні. Значення підвиразів, загорнутих у дужки, можна отримати через змінну ${BASH_REMATCH[@]}
, наприклад:
REGEXP='foo(bar)bl(.*)' if [[ "abcfoobarbletch" =~ $REGEXP ]] then echo "Регулярний вираз збігся з рядком!" echo "$BASH_REMATCH" # виводить: foobarbletch echo "${BASH_REMATCH[1]}" # виводить: bar echo "${BASH_REMATCH[2]}" # виводить: etch fi
Вбудовані регулярні вирази працюють швидше, ніж виконання зовнішньої команди grep, бо відповідний регулярний вираз виконується в межах процесу Bash. Якщо регулярний вираз або рядок містять пропуски або метасимволи (такі як '*
' або '?
'), їх слід узяти в лапки. Рекомендується використовувати змінну для зберігання регулярного виразу, як у вищенаведеному прикладі, для уникнення проблем з екрануванням спеціальних символів. Можна використовувати вивід bash із опцією -x
для перевірки, як саме bash сприймає ваш регулярний вираз.
Розширення дужок
Можливість розширення дужок запозичено в 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, як скриптову оболонку за умовчанням, що призвело до недієздатності численних скриптів.
Див. також
Виноски
- ↑ GNU Project. README file. Архів оригіналу за 26 червня 2013. Процитовано 3 лютого 2011.
Bash is free software, distributed under the terms of the [GNU] General Public License as published by the Free Software Foundation, version 3 of the License (or any later version)
Посилання
- Bash home page [Архівовано 13 серпня 2006 у Wayback Machine.] (англ.)
- Bash Guide for Beginners [Архівовано 8 серпня 2006 у Wayback Machine.] (англ.)
- Advanced Bash Scripting Guide [Архівовано 26 вересня 2008 у Wayback Machine.] (англ.)
- Learn X in Y minutes Where X=bash [Архівовано 22 березня 2018 у Wayback Machine.] (англ.)
- Конспект по Bash [Архівовано 22 березня 2018 у Wayback Machine.]
- Bash Debugger (англ.)
- Learning the shell. (англ.)
- 2008 interview with GNU Bash's maintainer, Chet Ramey (англ.)
- Bash Online Forum [Архівовано 14 травня 2019 у Wayback Machine.] (англ.)
- п
- о
- р
- lp[en]