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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[перевірена версія][очікує на перевірку]
Вилучено вміст Додано вміст
Виправлено джерел: 1; позначено як недійсні: 0. #IABot (v2.0beta10ehf1)
Hola6974 (обговорення | внесок)
мНемає опису редагування
 
(Не показані 11 проміжних версій 5 користувачів)
Рядок 2: Рядок 2:
{{Otheruses|Bash (значення)}}
{{Otheruses|Bash (значення)}}
{{Infobox software
{{Infobox software
| name = bash
| name = bash
| logo =
| logo =
| screenshot = [[Файл:Bash demo.png|250px]]
| screenshot = Bash demo.png
| caption = Екран роботи з Bash
| caption = Екран роботи з Bash
| author = [[Браян Фокс]] (Brian Fox)
| author = [[Браян Фокс]] (Brian Fox)
| released = {{start date and age|1989|6|7}}
| released = {{start date and age|1989|6|7}}
| latest release version = 4.2
| latest release version = 5.2.21
| latest release date = {{Release date|2014|02|27}}
| latest release date = {{Release date|2023|11|09}}
| frequently updated = yes
| frequently updated = yes
| programming language = [[C (мова програмування)|C]]
| programming language = [[C (мова програмування)|C]]
| operating system = [[крос-платформовий]]
| operating system = [[крос-платформовий]]
| platform = [[GNU]]
| platform = [[GNU]]
| language = англійська, багатомовна через [[gettext]]
| language = англійська, багатомовна через [[gettext]]
| status = активний
| status = активний
| genre = [[Командна оболонка Unix]]
| genre = [[Командна оболонка Unix]]
| source model = [[вільне програмне забезпечення]]
| source model = [[вільне програмне забезпечення]]
| license = [[GNU General Public License]] version 3+<ref name="license">{{cite web
| license = [[GNU General Public License]] version 3+<ref name="license">{{cite web
|author = GNU Project
|author = GNU Project
|authorlink = GNU
|authorlink = GNU
Рядок 29: Рядок 29:
|deadurl = no
|deadurl = no
}}</ref>
}}</ref>
| website = [http://tiswww.case.edu/php/chet/bash/bashtop.html домашня сторінка]
| 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''' (від {{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», що означає що «народився», звідси: народжена-знову командна оболонка. Також має місце інша гра слів: «born again» — «народжений знову».
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» ===
<source lang="bash">
<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash
echo Hello World!
echo Hello World!
</syntaxhighlight>
</source>
Цей скрипт містить лише два рядки. Перший повідомляє системі про те, яка програма використовується для запуску файлу. Другий рядок — це єдина дія, яка виконується цим скриптом, він, власне, друкує 'Hello world' у терміналі.
Цей скрипт містить лише два рядки. Перший повідомляє системі про те, яка програма використовується для запуску файлу. Другий рядок — це єдина дія, яка виконується цим скриптом, він, власне, друкує 'Hello world' у терміналі.


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


=== Цикли ===
=== Цикли ===
Приклад організації циклів
<source lang="bash">
<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>
<source lang="bash">
<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash
for i in `seq 1 10`;
for i in `seq 1 10`;
Рядок 70: Рядок 71:
echo $i
echo $i
done
done
</syntaxhighlight>
</source>
<source lang="bash">
<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash
COUNTER=0
COUNTER=0
Рядок 78: Рядок 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>


== Відмінний синтаксис ==
== Відмінний синтаксис ==
Рядок 85: Рядок 120:
=== Цілочисельна математика ===
=== Цілочисельна математика ===
Головне обмеження Bourne shell це те, що він не може виконувати обчислення з цілими числами без породження зовнішнього процесу. Bash може виконувати цілочисельні обчислення всередині процесу використовуючи команду <code>((…))</code> і синтаксис змінної <code>$[…]</code>, як показано нижче:
Головне обмеження Bourne shell це те, що він не може виконувати обчислення з цілими числами без породження зовнішнього процесу. Bash може виконувати цілочисельні обчислення всередині процесу використовуючи команду <code>((…))</code> і синтаксис змінної <code>$[…]</code>, як показано нижче:
<source lang="bash">
<syntaxhighlight lang="bash">
VAR=55 # Встановлюємо змінну VAR, рівною 55
VAR=55 # Встановлюємо змінну VAR, рівною 55
((VAR = VAR + 1)) # Додаємо одиницю до змінної VAR. Зверніть увагу на відсутність знака '$'
((VAR = VAR + 1)) # Додаємо одиницю до змінної VAR. Зверніть увагу на відсутність знака '$'
Рядок 92: Рядок 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>:
<source lang="bash">
<syntaxhighlight lang="bash">
if ((VAR == Y * 3 + X * 2))
if ((VAR == Y * 3 + X * 2))
then
then
Рядок 101: Рядок 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 не підтримує обчислення всередині процесу з числами з плаваючою крапкою. Тільки командні процесори [[UNIX]] підтримують цю можливість [[Korn-shell]] (версія [[1993]] року) і [[zsh]] (починаючи з версії 4.0).
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> одночасно. Використовується наступний синтаксис:
<source lang="bash">
<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> відповідно):
<source lang="bash">
<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]]»:
<source lang="bash">
<syntaxhighlight lang="bash">
command <<< "string to be read as standard input"
command <<< "string to be read as standard input"
</syntaxhighlight>
</source>


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


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


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


* Захоплення виведення зовнішніх команд:
* Захоплення виведення зовнішніх команд:
<source lang="bash">
<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]]:
<source lang="bash">
<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>, наприклад:


<source lang="bash">
<syntaxhighlight lang="bash">
REGEXP='foo(bar)bl(.*)'
REGEXP='foo(bar)bl(.*)'
if [[ "abcfoobarbletch" =~ $REGEXP ]]
if [[ "abcfoobarbletch" =~ $REGEXP ]]
Рядок 180: Рядок 215:
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 сприймає ваш регулярний вираз.
Рядок 186: Рядок 221:
=== Розширення дужок ===
=== Розширення дужок ===
Можливість розширення дужок запозичено в [[csh]]. Вона дозволяє довільному рядку бути сформованим з використанням схожої техніки, як це робиться з назвами файлів. Проте в ''bash'' згенеровані рядки не зобов'язані бути іменами файлів. Результат кожного розширення рядка не сортується, зберігається порядок зліва направо:
Можливість розширення дужок запозичено в [[csh]]. Вона дозволяє довільному рядку бути сформованим з використанням схожої техніки, як це робиться з назвами файлів. Проте в ''bash'' згенеровані рядки не зобов'язані бути іменами файлів. Результат кожного розширення рядка не сортується, зберігається порядок зліва направо:
<source lang="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>


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


== Виноски ==
== Виноски ==
Рядок 204: Рядок 245:


== Посилання ==
== Посилання ==
* [http://www.gnu.org/software/bash/bash.html Bash home page] {{ref-en}}
* [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] {{ref-en}}
* [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] {{ref-en}}
* [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] {{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]
* [https://codeguida.com/post/270/ Конспект по Bash] {{Webarchive|url=https://web.archive.org/web/20180322204554/https://codeguida.com/post/270/ |date=22 березня 2018 }}
* [http://bashdb.sf.net/bashdb.html Bash Debugger] {{ref-en}}
* [http://bashdb.sf.net/bashdb.html Bash Debugger] {{ref-en}}
* [http://linuxcommand.org/learning_the_shell.php Learning the shell]. {{ref-en}}
* [https://web.archive.org/web/20081026081119/http://www.linuxcommand.org/learning_the_shell.php Learning the shell]. {{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] {{ref-en}}
* [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] {{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}}
Рядок 222: Рядок 263:
[[Категорія:UNIX]]
[[Категорія:UNIX]]
[[Категорія:Командні оболонки Unix]]
[[Категорія:Командні оболонки Unix]]
[[Категорія:Багатоплатформне вільне програмне забезпечення]]
[[Категорія:Предметно-орієнтовані мови програмування]]
[[Категорія:Текстово-орієнтовані мови програмування]]
[[Категорія:Скриптові мови]]
[[Категорія:Статті з прикладами коду мовою 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)

Посилання

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