Екран роботи з Bash | |
Тип | Командна оболонка Unix |
---|---|
Автор | Браян Фокс (Brian Fox) |
Розробник | проєкт GNU |
Перший випуск | 7 червня 1989 |
Стабільний випуск | 4.2 (27 лютого 2014 ) |
Платформа | GNU |
Операційна система | крос-платформовий |
Мова програмування | C |
Доступні мови | англійська, багатомовна через gettext |
Стан розробки | активний |
Ліцензія | GNU General Public License version 3+ |
Онлайн-документація | gnu.org/software/bash/manual/ |
Репозиторій | git.savannah.gnu.org/cgit/bash.git |
Вебсайт | домашня сторінка |
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», що означає що «народився», звідси: народжена-знову командна оболонка. Також має місце інша гра слів: «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)»
- ↑ Free Software Directory
Посилання Редагувати
- 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 (англ.)
- . (англ.)
- (англ.)
- Bash Online Forum [ 14 травня 2019 у Wayback Machine.] (англ.)