Bash: відмінності між версіями

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[неперевірена версія][очікує на перевірку]
Вилучено вміст Додано вміст
DixonDBot (обговорення | внесок)
м Робот: змінено Категорія:Категорія:Юнікс; косметичні зміни
Hola6974 (обговорення | внесок)
мНемає опису редагування
 
(Не показані 48 проміжних версій 29 користувачів)
Рядок 1: Рядок 1:
{{lowercase}}
{{lowercase}}
{{Otheruses|Bash (значення)}}
{{Otheruses|Bash (значення)}}
{{Infobox software
[[Файл:Bash screenshot.png|thumb|Командна оболонка bash]]
| name = bash
'''bash''' (від {{lang-en|Bourne again shell}}, букв. ''перероджена Shell'') — вдосконалена й модернізована варіація командної оболонки [[Bourne shell]]. Один із найпопулярніших сучасних різновидів [[Командна оболонка Unix|командної оболонки UNIX]]. Особливо популярна в середовищі [[GNU/Linux]], де часто використовується як командна оболонка за замовчуванням.
| logo =
| screenshot = Bash demo.png
| caption = Екран роботи з Bash
| author = [[Браян Фокс]] (Brian Fox)
| released = {{start date and age|1989|6|7}}
| latest release version = 5.2.21
| latest release date = {{Release date|2023|11|09}}
| frequently updated = yes
| programming language = [[C (мова програмування)|C]]
| operating system = [[крос-платформовий]]
| platform = [[GNU]]
| language = англійська, багатомовна через [[gettext]]
| status = активний
| genre = [[Командна оболонка Unix]]
| source model = [[вільне програмне забезпечення]]
| 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>
| website = [http://tiswww.case.edu/php/chet/bash/bashtop.html домашня сторінка]
}}
'''bash''' (від {{lang-en|Bourne again shell}}, букв. ''перероджена Shell'') — вдосконалена й модернізована варіація командної оболонки [[Оболонка Борна|Bourne shell]]. Один із найпопулярніших сучасних різновидів [[Командна оболонка Unix|командної оболонки UNIX]]. Особливо популярна в середовищі [[Linux|GNU/Linux]], де часто використовується як командна оболонка за замовчуванням.


Bash це акронім ''Bourne-again-shell'', тобто ''знову оболонка Bourne''. Назва це гра слів на Bourne-shell — один з популярних різновидів командної оболонки для [[UNIX]] ([[sh]]), автором якої є Stephen Bourne ([[1978]]), вдосконалена в [[1987]] Brian Fox. Bourne (Бурн) перекликається з англійським словом «born», що означає що «народився», звідси: народжена-знову командна оболонка.
Bash — це акронім ''Bourne-again-shell'', тобто ''знову оболонка Bourne''. Назва — це гра слів на Bourne-shell — один з популярних різновидів командної оболонки для [[UNIX]] ([[Оболонка Борна|sh]]), автором якої є Stephen Bourne ([[1978]]), вдосконалена в [[1987]] Brian Fox. Bourne (Борн) перекликається з англійським словом «born», що означає що «народився», звідси: народжена-знову командна оболонка. Також має місце інша гра слів: «born again» — «народжений знову».


== Синтаксис ==
== Синтаксис ==
Синтаксис команд ''bash'' — це надмножина синтаксису команд Bourne shell. Остаточна специфікація синтаксису команд Bash є в [http://www.gnu.org/software/bash/manual/bashref.html Bash Reference Manual], що поширює проект [[GNU]].
Синтаксис команд ''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>
Цей скрипт містить лише два рядки. Перший повідомляє системі про те, яка програма використовується для запуску файлу. Другий рядок — це єдина дія, яка виконується цим скриптом, він власне друкує 'Hello world' на терміналі.
Цей скрипт містить лише два рядки. Перший повідомляє системі про те, яка програма використовується для запуску файлу. Другий рядок — це єдина дія, яка виконується цим скриптом, він, власне, друкує 'Hello world' у терміналі.


=== Умовний оператор ===
=== Умовний оператор ===
<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash
T1="foo"
T1="foo"
Рядок 23: Рядок 55:
echo умова не виконується
echo умова не виконується
fi
fi
</syntaxhighlight>


=== Цикли ===
=== Цикли ===
Приклад організації циклів
<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>

<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash
for i in `seq 1 10`;
for i in `seq 1 10`;
Рядок 35: Рядок 71:
echo $i
echo $i
done
done
</syntaxhighlight>

<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash
COUNTER=0
COUNTER=0
Рядок 42: Рядок 79:
let COUNTER=COUNTER+1
let COUNTER=COUNTER+1
done
done
</syntaxhighlight>

=== Функції ===
Оболонка підтримує механізм створення функцій. Після об'яви функції, її можна викликати як звичайну команду з таким самим способом передачі параметрів.
Функції створюються наступним чином
[ 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>


== Відмінний синтаксис ==
== Відмінний синтаксис ==
Переважна більшість важливих скриптів командного процесора Bourne можуть виконуватись без зміни в bash, за винятком тих скриптів Bourne, які посилаються на спеціальні змінні Bourne або використовують вбудовані команди Bourne. Синтаксис команд Bash включає ідеї, позичені в Korn shell ([[ksh]]) і C shell ([[csh]]), такі як редагування командного рядка, історія команд, стек директорію, змінні $RANDOM і $PPID, і синтаксис заміни команди [[POSIX]] : $(…) . Коли Bash використовується як інтерактивний командний процесор, він підтримує автозавершення імен програм, імен файлів, імен змінних тощо, якщо користувач натискає клавішу TAB
Переважна більшість важливих скриптів командного процесора Bourne можуть виконуватись без зміни в bash, за винятком тих скриптів Bourne, які посилаються на спеціальні змінні Bourne або використовують [[Список вбудованих команд bash|вбудовані команди]] Bourne. Синтаксис команд Bash включає ідеї, позичені в Korn shell ([[Korn-shell|ksh]]) і C shell ([[csh]]), такі як редагування командного рядка, історія команд, стек директорію, змінні <code>$RANDOM</code> і <code>$PPID</code>, і синтаксис заміни команди [[POSIX]] : <code>$(…)</code> . Коли Bash використовується як інтерактивний командний процесор, він підтримує автозавершення імен програм, імен файлів, імен змінних тощо, якщо користувач натискає клавішу <code>TAB</code>.


=== Цілочисельна математика ===
=== Цілочисельна математика ===
Головне обмеження Bourne shell це те, що він не може виконувати обчислення з цілими числами без породження зовнішнього процесу. Bash може виконувати цілочисельні обчислення всередині процесу використовуючи команду ((…)) і синтаксис змінної $[…], як показано нижче:
Головне обмеження 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. Зверніть увагу на відсутність знака '$'
Рядок 54: Рядок 127:
echo $[VAR * 22] # Множимо VAR на 22 і передаємо результат команді
echo $[VAR * 22] # Множимо VAR на 22 і передаємо результат команді
echo $((VAR * 22)) # Інший спосіб зробити те саме
echo $((VAR * 22)) # Інший спосіб зробити те саме
</syntaxhighlight>


Команда ((…)) так само може використовуватися в умовних твердженнях, тому що її вихідний параметр це 0 або 1, які можуть інтерпретуватися як true або false:
Команда <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
Рядок 61: Рядок 136:
fi
fi
((Z > 23)) && echo Yes
((Z > 23)) && echo Yes
</syntaxhighlight>


Команда ((…)) підтримує такі відносні оператори: '==' '!=', '>', '<', '>=', і '<='.
Команда <code>((…))</code> підтримує оператори відношення <code> ==</code>,<code> !=</code>,<code> ></code>,<code> <</code>,<code> >=</code> та <code><=</code>.


Bash не підтримує обчислення всередині процесу з числами з плаваючою крапкою. Тільки командні процесори [[Unix]] підтримують цю можливість [[Korn-shell]] (версія [[1993]] року ) і [[zsh]] (починаючи з версії 4.0).
Bash не підтримує обчислення всередині процесу з [[Число з рухомою комою|числами з рухомою комою]]. Тільки командні процесори [[UNIX]] підтримують цю можливість [[Korn-shell]] (версія [[1993]] року) і [[zsh]] (починаючи з версії 4.0).


=== Перенаправлення I/O ===
=== Перенаправлення потоків ===
Bash має індивідуальний синтаксис перенаправлення, який не підтримує Bourne shell. Bash може перенаправляти стандартний вивід і стандартні помилки одночасно, використовуючи наступний синтаксис :
''Bash'' має індивідуальний синтаксис перенаправлення [[Стандартні потоки|потоків вводу/виводу]], який не підтримує ''Bourne shell''. ''Bash'' може перенаправляти стандартний потік виводу <code>stdout</code> та стандартний потік повідомлень про помилки <code>stderr</code> в один файл <code>file</code> одночасно. Використовується наступний синтаксис:
<syntaxhighlight lang="bash">
command &> file
command &> file
</syntaxhighlight>


що простіше набрати, ніж еквівалентну команду в синтаксисі Bourne shell
що простіше набрати, ніж еквівалентну команду в синтаксисі ''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>


Bash, починаючи з версії 2.05b, може перенаправляти стандартний ввід із рядка, використовуючи наступний синтаксис (який іноді називають «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>


Якщо рядок містить пропуски, його слід узяти в лапки.
Якщо рядок містить пропуски, його слід узяти в лапки.


'''Приклади''':
'''Приклад''': Перенаправлення стандартного виводу у файл, запис даних, закриття файлу, скидання stdout

* Перенаправлення стандартного виводу у файл, запис даних, закриття файлу, скидання <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
Рядок 91: Рядок 176:
# close FD6
# close FD6
exec 6>&-
exec 6>&-
</syntaxhighlight>


* Відкривання та закривання файлів:
Відкриття і закриття файлів:
<syntaxhighlight lang="bash">
# open file test.data for reading
# open file test.data for reading
exec 6<test.data
exec 6<test.data
Рядок 102: Рядок 189:
# close file test.data
# close file test.data
exec 6<&-
exec 6<&-
</syntaxhighlight>


Захоплення виведення зовнішніх команд:
* Захоплення виведення зовнішніх команд:
<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>


=== Регулярні вирази всередині процесу ===
=== Регулярні вирази всередині процесу ===
Bash 3.0 підтримує вбудовані [[регулярні вирази]], з синтаксисом подібним до синтаксису [[Perl]]:
Bash 3.0 підтримує вбудовані [[Регулярний вираз|регулярні вирази]], з синтаксисом подібним до синтаксису [[Perl]]:
<syntaxhighlight lang="bash">
[[ string =~ regex ]]
</syntaxhighlight>


Синтаксис регулярних виразів задокументовано на сторінках документації <code>man 7 regex</code>. Статус виходу встановлюється в 0, якщо регулярний вираз збігся з рядком, і 1, якщо ні. Значення підвиразів, загорнутих у дужки, можна отримати через змінну <code>${BASH_REMATCH[@]}</code>, наприклад:
[[ string =~ regex ]]

Синтаксис регулярних виразів задокументовано на сторінках документації man 7 regex. Статус виходу встановлюється в 0, якщо регулярний вираз співпав з рядком, і 1, якщо ні. Значення підвиразів, загорнутих у дужки, можна отримати через змінну ${BASH_REMATCH[@]}, наприклад:


<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>


Вбудовані регулярні вирази працюють швидше, ніж виконання зовнішньої команди grep, бо відповідний регулярний вираз виконується в межах процесу Bash. Якщо регулярний вираз або рядок містять пропуски або метасимволи (такі як '*' or '?'), їх слід узяти в лапки. Рекомендується використовувати змінну для зберігання регулярного виразу, як у вищенаведеному прикладі, для уникнення проблем з екрануванням спеціальних символів. Можна використовувати вивід bash із опцією -x для перевірки, як саме bash сприймає ваш регулярний вираз.
Вбудовані регулярні вирази працюють швидше, ніж виконання зовнішньої команди grep, бо відповідний регулярний вираз виконується в межах процесу Bash. Якщо регулярний вираз або рядок містять пропуски або метасимволи (такі як '<code>*</code>' або '<code>?</code>'), їх слід узяти в лапки. Рекомендується використовувати змінну для зберігання регулярного виразу, як у вищенаведеному прикладі, для уникнення проблем з екрануванням спеціальних символів. Можна використовувати вивід bash із опцією <code>-x</code> для перевірки, як саме bash сприймає ваш регулярний вираз.


=== Розширення дужок ===
=== Розширення дужок ===
Можливість розширення дужок запозичено в [[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>


Не слід використовувати цю особливість, якщо скрипт планується портувати, бо в традиційних скриптах розширення рядка не діятиме:
Не слід використовувати цю особливість, якщо скрипт планується портувати, бо в традиційних скриптах розширення рядка не діятиме:
<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>


== Переносимість ==
== Переносимість ==
Скрипти оболонок, написані зі специфічними для ''bash'' особливостями (''bashism-и'') не будуть працювати на системах, де використовується Bourne shell або один із його замінників, без того, щоб ''bash'' був встановлений як додаткова оболонка, і звісно, скрипти треба починати з #!/bin/bash. Ця проблема стала особливо важливою, коли [[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]]

== Виноски ==
{{reflist}}


== Посилання ==
== Посилання ==
* [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}}
* [http://bashdb.sf.net/bashdb.html Bash Debugger]
* [https://codeguida.com/post/270/ Конспект по Bash] {{Webarchive|url=https://web.archive.org/web/20180322204554/https://codeguida.com/post/270/ |date=22 березня 2018 }}
* [http://linuxcommand.org/learning_the_shell.php Learning the shell].
* [http://bashdb.sf.net/bashdb.html Bash Debugger] {{ref-en}}
* [http://www.computerworld.com.au/index.php/id;1591223321;fp;16;fpid;1;pf;1 2008 interview with GNU Bash's maintainer, Chet Ramey]
* [https://web.archive.org/web/20081026081119/http://www.linuxcommand.org/learning_the_shell.php Learning the shell]. {{ref-en}}
* [http://bashscripts.org Bash Online Forum]
* [https://web.archive.org/web/20081205093522/http://www.computerworld.com.au/index.php/id;1591223321;fp;16;fpid;1;pf;1 2008 interview with GNU Bash's maintainer, Chet Ramey] {{ref-en}}
* [http://bashscripts.org Bash Online Forum] {{Webarchive|url=https://web.archive.org/web/20190514142935/http://bashscripts.org/ |date=14 травня 2019 }} {{ref-en}}


{{Команди Unix}}
{{Команди Unix}}
{{Інтерфейси користувача в UNIX-подібних системах}}
{{GNU}}
{{Unix shells}}


[[Категорія:GNU]]
[[Категорія:UNIX]]
[[Категорія:UNIX]]
[[Категорія:Лінукс]]
[[Категорія:Командні оболонки Unix]]
[[Категорія:Багатоплатформне вільне програмне забезпечення]]
[[Категорія:Предметно-орієнтовані мови програмування]]
[[Категорія:Текстово-орієнтовані мови програмування]]
[[Категорія:Скриптові мови]]
[[Категорія:Скриптові мови]]
[[Категорія:Командна оболонка Unix]]
[[Категорія:Статті з прикладами коду мовою Bash]]

[[ar:باش]]
[[bg:Bash]]
[[bs:Bash]]
[[ca:Bash]]
[[cs:Bash]]
[[de:Bourne-again shell]]
[[el:Κέλυφος bash]]
[[en:Bash (Unix shell)]]
[[eo:Bash]]
[[es:Bash]]
[[et:Bash]]
[[eu:Bash]]
[[fa:بش]]
[[fi:Bash]]
[[fr:Bourne-Again shell]]
[[gl:Bash]]
[[he:Bourne-again shell]]
[[hr:Bash]]
[[hu:Bash]]
[[id:Bourne-Again shell]]
[[is:Bash]]
[[it:Bash]]
[[ja:Bash]]
[[ko:Bash]]
[[ms:Bash]]
[[nl:Bash]]
[[pl:Bash]]
[[pt:Bash]]
[[ro:Bash]]
[[ru:Bash]]
[[sh:Bash]]
[[sk:Bash]]
[[sr:Баш]]
[[sv:Bash]]
[[th:Bash]]
[[tr:Bash]]
[[zh:Bash]]

Поточна версія на 09:58, 1 липня 2024

bash
Екран роботи з Bash
ТипКомандна оболонка Unix
АвторБраян Фокс (Brian Fox)
Розробникпроєкт GNU
Перший випуск7 червня 1989; 35 років тому (1989-06-07)
Стабільний випуск5.2.21 (9 листопада 2023; 8 місяців тому (2023-11-09))
Платформа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.

«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, як скриптову оболонку за умовчанням, що призвело до недієздатності численних скриптів.

Див. також

[ред. | ред. код]

Виноски

[ред. | ред. код]
  1. 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)

Посилання

[ред. | ред. код]