Bash: відмінності між версіями
[перевірена версія] | [очікує на перевірку] |
Немає опису редагування |
мНемає опису редагування |
||
(Не показані 18 проміжних версій 10 користувачів) | |||
Рядок 2: | Рядок 2: | ||
{{Otheruses|Bash (значення)}} |
{{Otheruses|Bash (значення)}} |
||
{{Infobox software |
{{Infobox software |
||
| name |
| name = bash |
||
| logo |
| logo = |
||
| screenshot |
| screenshot = Bash demo.png |
||
| caption |
| caption = Екран роботи з Bash |
||
| author |
| author = [[Браян Фокс]] (Brian Fox) |
||
| released |
| released = {{start date and age|1989|6|7}} |
||
| latest release version = |
| latest release version = 5.2.21 |
||
| latest release date |
| latest release date = {{Release date|2023|11|09}} |
||
| frequently updated |
| frequently updated = yes |
||
| programming language |
| programming language = [[C (мова програмування)|C]] |
||
| operating system |
| operating system = [[крос-платформовий]] |
||
| platform |
| platform = [[GNU]] |
||
| language |
| language = англійська, багатомовна через [[gettext]] |
||
| status |
| status = активний |
||
| genre |
| genre = [[Командна оболонка Unix]] |
||
| source model |
| source model = [[вільне програмне забезпечення]] |
||
| license |
| license = [[GNU General Public License]] version 3+<ref name="license">{{cite web |
||
| |
|author = GNU Project |
||
| |
|authorlink = GNU |
||
| |
|title = README file |
||
| |
|url = http://tiswww.case.edu/php/chet/bash/README |
||
| |
|quote = 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) |
||
| |
|archiveurl = https://www.webcitation.org/6HfmPATVa?url=http://tiswww.case.edu/php/chet/bash/README |
||
| |
|archivedate = 2013-06-26 |
||
|accessdate = 2011-02-03 |
|||
|deadurl = no |
|||
}}</ref> |
}}</ref> |
||
| website |
| website = [http://tiswww.case.edu/php/chet/bash/bashtop.html домашня сторінка] |
||
}} |
}} |
||
'''bash''' (від {{lang-en|Bourne again shell}}, букв. ''перероджена Shell'') |
'''bash''' (від {{lang-en|Bourne again shell}}, букв. ''перероджена Shell'') — вдосконалена й модернізована варіація командної оболонки [[Оболонка Борна|Bourne shell]]. Один із найпопулярніших сучасних різновидів [[Командна оболонка Unix|командної оболонки UNIX]]. Особливо популярна в середовищі [[Linux|GNU/Linux]], де часто використовується як командна оболонка за замовчуванням. |
||
Bash — це акронім ''Bourne-again-shell'', тобто ''знову оболонка Bourne''. Назва — це гра слів на Bourne-shell |
Bash — це акронім ''Bourne-again-shell'', тобто ''знову оболонка Bourne''. Назва — це гра слів на Bourne-shell — один з популярних різновидів командної оболонки для [[UNIX]] ([[Оболонка Борна|sh]]), автором якої є Stephen Bourne ([[1978]]), вдосконалена в [[1987]] Brian Fox. Bourne (Борн) перекликається з англійським словом «born», що означає що «народився», звідси: народжена-знову командна оболонка. Також має місце інша гра слів: «born again» — «народжений знову». |
||
== Синтаксис == |
== Синтаксис == |
||
Синтаксис команд ''bash'' |
Синтаксис команд ''bash'' — це надмножина синтаксису команд Bourne shell. Остаточна специфікація синтаксису команд Bash є в [http://www.gnu.org/software/bash/manual/bashref.html Bash Reference Manual] {{Webarchive|url=https://www.webcitation.org/618xRKJBw?url=http://www.gnu.org/software/bash/manual/bashref.html |date=23 серпня 2011 }}, що поширює проект [[GNU]]. |
||
=== «hello world» === |
=== «hello world» === |
||
< |
<syntaxhighlight lang="bash"> |
||
#!/bin/bash |
#!/bin/bash |
||
echo Hello World! |
echo Hello World! |
||
</syntaxhighlight> |
|||
</source> |
|||
Цей скрипт містить лише два рядки. Перший повідомляє системі про те, яка програма використовується для запуску файлу. Другий рядок — це єдина дія, яка виконується цим скриптом, він, власне, друкує 'Hello world' у терміналі. |
Цей скрипт містить лише два рядки. Перший повідомляє системі про те, яка програма використовується для запуску файлу. Другий рядок — це єдина дія, яка виконується цим скриптом, він, власне, друкує 'Hello world' у терміналі. |
||
=== Умовний оператор === |
=== Умовний оператор === |
||
< |
<syntaxhighlight lang="bash"> |
||
#!/bin/bash |
#!/bin/bash |
||
T1="foo" |
T1="foo" |
||
Рядок 53: | Рядок 55: | ||
echo умова не виконується |
echo умова не виконується |
||
fi |
fi |
||
</syntaxhighlight> |
|||
</source> |
|||
=== Цикли === |
=== Цикли === |
||
Приклад організації циклів |
|||
< |
<syntaxhighlight lang="bash"> |
||
#!/bin/bash |
#!/bin/bash |
||
for i in $( ls ); do |
for i in $( ls ); do |
||
echo item: $i |
echo item: $i |
||
done |
done |
||
</syntaxhighlight> |
|||
</source> |
|||
< |
<syntaxhighlight lang="bash"> |
||
#!/bin/bash |
#!/bin/bash |
||
for i in `seq 1 10`; |
for i in `seq 1 10`; |
||
Рядок 68: | Рядок 71: | ||
echo $i |
echo $i |
||
done |
done |
||
</syntaxhighlight> |
|||
</source> |
|||
< |
<syntaxhighlight lang="bash"> |
||
#!/bin/bash |
#!/bin/bash |
||
COUNTER=0 |
COUNTER=0 |
||
Рядок 76: | Рядок 79: | ||
let COUNTER=COUNTER+1 |
let COUNTER=COUNTER+1 |
||
done |
done |
||
</syntaxhighlight> |
|||
</source> |
|||
=== Функції === |
|||
Оболонка підтримує механізм створення функцій. Після об'яви функції, її можна викликати як звичайну команду з таким самим способом передачі параметрів. |
|||
Функції створюються наступним чином |
|||
[ function ] ім'я_функції () перелік_команд [перенаправлення] |
|||
де |
|||
* '''function''' — не обов'язковий оператор об'яви функції; |
|||
* ім'я_функції () — ім'я нової функції з обов'язковим додаванням дужок; |
|||
* перелік_команд — списком команд, які розміщені між фігурними дужками ''{}'' |
|||
Приклад функції, яка перевіряє чи є вказаний параметр шляхом до теки |
|||
<syntaxhighlight lang="bash"> |
|||
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 |
|||
</syntaxhighlight> |
|||
== Відмінний синтаксис == |
== Відмінний синтаксис == |
||
Рядок 83: | Рядок 120: | ||
=== Цілочисельна математика === |
=== Цілочисельна математика === |
||
Головне обмеження Bourne shell це те, що він не може виконувати обчислення з цілими числами без породження зовнішнього процесу. Bash може виконувати цілочисельні обчислення всередині процесу використовуючи команду <code>((…))</code> і синтаксис змінної <code>$[…]</code>, як показано нижче: |
Головне обмеження Bourne shell це те, що він не може виконувати обчислення з цілими числами без породження зовнішнього процесу. Bash може виконувати цілочисельні обчислення всередині процесу використовуючи команду <code>((…))</code> і синтаксис змінної <code>$[…]</code>, як показано нижче: |
||
< |
<syntaxhighlight lang="bash"> |
||
VAR=55 # Встановлюємо змінну VAR, рівною 55 |
VAR=55 # Встановлюємо змінну VAR, рівною 55 |
||
((VAR = VAR + 1)) # Додаємо одиницю до змінної VAR. Зверніть увагу на відсутність знака '$' |
((VAR = VAR + 1)) # Додаємо одиницю до змінної VAR. Зверніть увагу на відсутність знака '$' |
||
Рядок 90: | Рядок 127: | ||
echo $[VAR * 22] # Множимо VAR на 22 і передаємо результат команді |
echo $[VAR * 22] # Множимо VAR на 22 і передаємо результат команді |
||
echo $((VAR * 22)) # Інший спосіб зробити те саме |
echo $((VAR * 22)) # Інший спосіб зробити те саме |
||
</syntaxhighlight> |
|||
</source> |
|||
Команда <code>((…))</code> так само може використовуватися в умовних твердженнях, тому що її вихідний параметр це 0 або 1, які можуть інтерпретуватися як <code>true</code> або <code>false</code>: |
Команда <code>((…))</code> так само може використовуватися в умовних твердженнях, тому що її вихідний параметр це 0 або 1, які можуть інтерпретуватися як <code>true</code> або <code>false</code>: |
||
< |
<syntaxhighlight lang="bash"> |
||
if ((VAR == Y * 3 + X * 2)) |
if ((VAR == Y * 3 + X * 2)) |
||
then |
then |
||
Рядок 99: | Рядок 136: | ||
fi |
fi |
||
((Z > 23)) && echo Yes |
((Z > 23)) && echo Yes |
||
</syntaxhighlight> |
|||
</source> |
|||
Команда <code>((…))</code> підтримує оператори відношення <code> ==</code>,<code> !=</code>,<code> ></code>,<code> <</code>,<code> >=</code> та <code><=</code>. |
Команда <code>((…))</code> підтримує оператори відношення <code> ==</code>,<code> !=</code>,<code> ></code>,<code> <</code>,<code> >=</code> та <code><=</code>. |
||
Bash не підтримує обчислення всередині процесу з числами з |
Bash не підтримує обчислення всередині процесу з [[Число з рухомою комою|числами з рухомою комою]]. Тільки командні процесори [[UNIX]] підтримують цю можливість [[Korn-shell]] (версія [[1993]] року) і [[zsh]] (починаючи з версії 4.0). |
||
=== Перенаправлення потоків === |
=== Перенаправлення потоків === |
||
''Bash'' має індивідуальний синтаксис перенаправлення [[Стандартні потоки|потоків вводу/виводу]], який не підтримує ''Bourne shell''. ''Bash'' може перенаправляти стандартний потік виводу <code>stdout</code> та стандартний потік повідомлень про помилки <code>stderr</code> в один файл <code>file</code> одночасно. Використовується наступний синтаксис: |
''Bash'' має індивідуальний синтаксис перенаправлення [[Стандартні потоки|потоків вводу/виводу]], який не підтримує ''Bourne shell''. ''Bash'' може перенаправляти стандартний потік виводу <code>stdout</code> та стандартний потік повідомлень про помилки <code>stderr</code> в один файл <code>file</code> одночасно. Використовується наступний синтаксис: |
||
< |
<syntaxhighlight lang="bash"> |
||
command &> file |
command &> file |
||
</syntaxhighlight> |
|||
</source> |
|||
що простіше набрати, ніж еквівалентну команду в синтаксисі ''Bourne shell'', яка спочатку перенаправляє потік <code>stdout</code> у файл <code>file</code>, а потім перенаправляє <code>stderr</code> в той же потік, що і <code>stdout</code> (<code>1</code> та <code>2</code> тут номери стандартних потоків <code>stdout</code> та <code>stderr</code> відповідно): |
що простіше набрати, ніж еквівалентну команду в синтаксисі ''Bourne shell'', яка спочатку перенаправляє потік <code>stdout</code> у файл <code>file</code>, а потім перенаправляє <code>stderr</code> в той же потік, що і <code>stdout</code> (<code>1</code> та <code>2</code> тут номери стандартних потоків <code>stdout</code> та <code>stderr</code> відповідно): |
||
< |
<syntaxhighlight lang="bash"> |
||
command >file 2>&1 |
command >file 2>&1 |
||
</syntaxhighlight> |
|||
</source> |
|||
''Bash'', починаючи з версії 2.05b, може перенаправляти стандартний ввід <code>stdin</code> на текст із рядка, використовуючи синтаксис, який іноді називають «[[Here-document|here strings]]»: |
''Bash'', починаючи з версії 2.05b, може перенаправляти стандартний ввід <code>stdin</code> на текст із рядка, використовуючи синтаксис, який іноді називають «[[Here-document|here strings]]»: |
||
< |
<syntaxhighlight lang="bash"> |
||
command <<< "string to be read as standard input" |
command <<< "string to be read as standard input" |
||
</syntaxhighlight> |
|||
</source> |
|||
Якщо рядок містить пропуски, його слід узяти в лапки. |
Якщо рядок містить пропуски, його слід узяти в лапки. |
||
Рядок 126: | Рядок 163: | ||
* Перенаправлення стандартного виводу у файл, запис даних, закриття файлу, скидання <code>stdout</code> |
* Перенаправлення стандартного виводу у файл, запис даних, закриття файлу, скидання <code>stdout</code> |
||
< |
<syntaxhighlight lang="bash"> |
||
# make Filedescriptor(FD) 6 a copy of stdout (FD 1) |
# make Filedescriptor(FD) 6 a copy of stdout (FD 1) |
||
exec 6>&1 |
exec 6>&1 |
||
Рядок 139: | Рядок 176: | ||
# close FD6 |
# close FD6 |
||
exec 6>&- |
exec 6>&- |
||
</syntaxhighlight> |
|||
</source> |
|||
* Відкривання та закривання файлів: |
* Відкривання та закривання файлів: |
||
< |
<syntaxhighlight lang="bash"> |
||
# open file test.data for reading |
# open file test.data for reading |
||
exec 6<test.data |
exec 6<test.data |
||
Рядок 152: | Рядок 189: | ||
# close file test.data |
# close file test.data |
||
exec 6<&- |
exec 6<&- |
||
</syntaxhighlight> |
|||
</source> |
|||
* Захоплення виведення зовнішніх команд: |
* Захоплення виведення зовнішніх команд: |
||
< |
<syntaxhighlight lang="bash"> |
||
# execute 'find' and store results in VAR |
# execute 'find' and store results in VAR |
||
# search for filenames which end with the letter "h" |
# search for filenames which end with the letter "h" |
||
VAR=$(find . -name "*h") |
VAR=$(find . -name "*h") |
||
</syntaxhighlight> |
|||
</source> |
|||
=== Регулярні вирази всередині процесу === |
=== Регулярні вирази всередині процесу === |
||
Bash 3.0 підтримує вбудовані [[Регулярний вираз|регулярні вирази]], з синтаксисом подібним до синтаксису [[Perl]]: |
Bash 3.0 підтримує вбудовані [[Регулярний вираз|регулярні вирази]], з синтаксисом подібним до синтаксису [[Perl]]: |
||
< |
<syntaxhighlight lang="bash"> |
||
[[ string =~ regex ]] |
[[ string =~ regex ]] |
||
</syntaxhighlight> |
|||
</source> |
|||
Синтаксис регулярних виразів задокументовано на сторінках документації <code>man 7 regex</code>. Статус виходу встановлюється в 0, якщо регулярний вираз збігся з рядком, і 1, якщо ні. Значення підвиразів, загорнутих у дужки, можна отримати через змінну <code>${BASH_REMATCH[@]}</code>, наприклад: |
Синтаксис регулярних виразів задокументовано на сторінках документації <code>man 7 regex</code>. Статус виходу встановлюється в 0, якщо регулярний вираз збігся з рядком, і 1, якщо ні. Значення підвиразів, загорнутих у дужки, можна отримати через змінну <code>${BASH_REMATCH[@]}</code>, наприклад: |
||
< |
<syntaxhighlight lang="bash"> |
||
REGEXP='foo(bar)bl(.*)' |
REGEXP='foo(bar)bl(.*)' |
||
if [[ "abcfoobarbletch" =~ $REGEXP ]] |
if [[ "abcfoobarbletch" =~ $REGEXP ]] |
||
then |
then |
||
echo "Регулярний вираз |
echo "Регулярний вираз збігся з рядком!" |
||
echo "$BASH_REMATCH" # виводить: foobarbletch |
echo "$BASH_REMATCH" # виводить: foobarbletch |
||
echo "${BASH_REMATCH[1]}" # виводить: bar |
echo "${BASH_REMATCH[1]}" # виводить: bar |
||
echo "${BASH_REMATCH[2]}" # виводить: etch |
echo "${BASH_REMATCH[2]}" # виводить: etch |
||
fi |
fi |
||
</syntaxhighlight> |
|||
</source> |
|||
Вбудовані регулярні вирази працюють швидше, ніж виконання зовнішньої команди grep, бо відповідний регулярний вираз виконується в межах процесу Bash. Якщо регулярний вираз або рядок містять пропуски або метасимволи (такі як '<code>*</code>' або '<code>?</code>'), їх слід узяти в лапки. Рекомендується використовувати змінну для зберігання регулярного виразу, як у вищенаведеному прикладі, для уникнення проблем з екрануванням спеціальних символів. Можна використовувати вивід bash із опцією <code>-x</code> для перевірки, як саме bash сприймає ваш регулярний вираз. |
Вбудовані регулярні вирази працюють швидше, ніж виконання зовнішньої команди grep, бо відповідний регулярний вираз виконується в межах процесу Bash. Якщо регулярний вираз або рядок містять пропуски або метасимволи (такі як '<code>*</code>' або '<code>?</code>'), їх слід узяти в лапки. Рекомендується використовувати змінну для зберігання регулярного виразу, як у вищенаведеному прикладі, для уникнення проблем з екрануванням спеціальних символів. Можна використовувати вивід bash із опцією <code>-x</code> для перевірки, як саме bash сприймає ваш регулярний вираз. |
||
Рядок 184: | Рядок 221: | ||
=== Розширення дужок === |
=== Розширення дужок === |
||
Можливість розширення дужок запозичено в [[csh]]. Вона дозволяє довільному рядку бути сформованим з використанням схожої техніки, як це робиться з назвами файлів. Проте в ''bash'' згенеровані рядки не зобов'язані бути іменами файлів. Результат кожного розширення рядка не сортується, зберігається порядок зліва направо: |
Можливість розширення дужок запозичено в [[csh]]. Вона дозволяє довільному рядку бути сформованим з використанням схожої техніки, як це робиться з назвами файлів. Проте в ''bash'' згенеровані рядки не зобов'язані бути іменами файлів. Результат кожного розширення рядка не сортується, зберігається порядок зліва направо: |
||
< |
<syntaxhighlight lang="bash"> |
||
# This is a bash specific feature |
# This is a bash specific feature |
||
echo a{p,c,d,b}e # ape ace ade abe |
echo a{p,c,d,b}e # ape ace ade abe |
||
</syntaxhighlight> |
|||
</source> |
|||
Не слід використовувати цю особливість, якщо скрипт планується портувати, бо в традиційних скриптах розширення рядка не діятиме: |
Не слід використовувати цю особливість, якщо скрипт планується портувати, бо в традиційних скриптах розширення рядка не діятиме: |
||
< |
<syntaxhighlight lang="bash"> |
||
# A traditional shell does not produce the same output |
# A traditional shell does not produce the same output |
||
echo a{p,c,d,b}e # a{p,c,d,b}e |
echo a{p,c,d,b}e # a{p,c,d,b}e |
||
</syntaxhighlight> |
|||
</source> |
|||
== Переносимість == |
== Переносимість == |
||
Скрипти оболонок, написані зі специфічними для ''bash'' особливостями (''bashism-и'') не будуть працювати на системах, де використовується Bourne shell або один із його замінників, без того, щоб ''bash'' був встановлений як додаткова оболонка, і звісно, скрипти треба починати з <code>#!/bin/bash</code>. Ця проблема стала особливо важливою, коли [[Ubuntu]] почав із жовтня [[2006]], поставляти [[Debian Almquist shell]], ''dash'', як скриптову оболонку за умовчанням, що призвело до недієздатності численних скриптів. |
Скрипти оболонок, написані зі специфічними для ''bash'' особливостями (''bashism-и'') не будуть працювати на системах, де використовується Bourne shell або один із його замінників, без того, щоб ''bash'' був встановлений як додаткова оболонка, і звісно, скрипти треба починати з <code>#!/bin/bash</code>. Ця проблема стала особливо важливою, коли [[Ubuntu]] почав із жовтня [[2006]], поставляти [[Debian Almquist shell]], ''dash'', як скриптову оболонку за умовчанням, що призвело до недієздатності численних скриптів. |
||
== Див. також == |
|||
* [[Список вбудованих команд bash]] |
|||
* [[Командна оболонка Unix]] |
|||
* [[Оболонка Борна]] |
|||
* [[Korn-shell]] |
|||
== Виноски == |
== Виноски == |
||
Рядок 202: | Рядок 245: | ||
== Посилання == |
== Посилання == |
||
* [http://www.gnu.org/software/bash/bash.html Bash home page] |
* [http://www.gnu.org/software/bash/bash.html Bash home page] {{Webarchive|url=https://web.archive.org/web/20060813010211/http://www.gnu.org/software/bash/bash.html |date=13 серпня 2006 }} {{ref-en}} |
||
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html Bash Guide for Beginners] |
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html Bash Guide for Beginners] {{Webarchive|url=https://web.archive.org/web/20060808220934/http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html |date=8 серпня 2006 }} {{ref-en}} |
||
* [http://tldp.org/LDP/abs/html/index.html Advanced Bash Scripting Guide] |
* [http://tldp.org/LDP/abs/html/index.html Advanced Bash Scripting Guide] {{Webarchive|url=https://web.archive.org/web/20080926073442/http://tldp.org/LDP/abs/html/index.html |date=26 вересня 2008 }} {{ref-en}} |
||
* [https://learnxinyminutes.com/docs/bash/ Learn X in Y minutes Where X=bash] {{Webarchive|url=https://web.archive.org/web/20180322204812/https://learnxinyminutes.com/docs/bash/ |date=22 березня 2018 }} {{ref-en}} |
|||
⚫ | |||
* [https://codeguida.com/post/270/ Конспект по Bash] {{Webarchive|url=https://web.archive.org/web/20180322204554/https://codeguida.com/post/270/ |date=22 березня 2018 }} |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
* [http://bashscripts.org Bash Online Forum] |
|||
⚫ | |||
* [http://bashscripts.org Bash Online Forum] {{Webarchive|url=https://web.archive.org/web/20190514142935/http://bashscripts.org/ |date=14 травня 2019 }} {{ref-en}} |
|||
{{Команди Unix}} |
{{Команди Unix}} |
||
Рядок 217: | Рядок 262: | ||
[[Категорія:GNU]] |
[[Категорія:GNU]] |
||
[[Категорія:UNIX]] |
[[Категорія:UNIX]] |
||
⚫ | |||
[[Категорія:Командні оболонки Unix]] |
[[Категорія:Командні оболонки Unix]] |
||
[[Категорія:Багатоплатформне вільне програмне забезпечення]] |
|||
[[Категорія:Предметно-орієнтовані мови програмування]] |
|||
[[Категорія:Текстово-орієнтовані мови програмування]] |
|||
⚫ | |||
[[Категорія:Статті з прикладами коду мовою Bash]] |
Поточна версія на 09:58, 1 липня 2024
Тип | Командна оболонка Unix |
---|---|
Автор | Браян Фокс (Brian Fox) |
Розробник | проєкт GNU |
Перший випуск | 7 червня 1989 |
Стабільний випуск | 5.2.21 (9 листопада 2023 ) |
Платформа | GNU |
Операційна система | крос-платформовий |
Мова програмування | C |
Доступні мови | англійська, багатомовна через gettext |
Стан розробки | активний |
Ліцензія | GNU General Public License version 3+[1] |
Онлайн-документація | gnu.org/software/bash/manual/ |
Репозиторій | git.savannah.gnu.org/cgit/bash.git |
Вебсайт | домашня сторінка |
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.
#!/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.] (англ.)
|
|
|