bash

Матеріал з Вікіпедії — вільної енциклопедії.

Перейти до: навігація, пошук
Командна оболонка bash

bash (від англ. Bourne again shell, букв. перероджена Shell) — вдосконалена і модернізована варіація командної оболонки Bourne shell. Один з найпопулярніших сучасних різновидів командної оболонки UNIX. Особливо популярна в середовищі GNU/Linux, де воно часто використовується як командна оболонка за замовчуванням.

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

Зміст

[ред.] Синтаксис

Синтаксис команд bash — це надмножина синтаксису команд Bourne shell. Остаточна специфікація синтаксису команд Bash є в Bash Reference Manual, що поширює проект 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

[ред.] Відмінний синтаксис

Переважна більшість важливих скриптів командного процесора 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).

[ред.] Перенаправлення I/O

Bash має індивідуальний синтаксис перенаправлення, який не підтримує Bourne shell. Bash може перенаправляти стандартний вивід і стандартні помилки одночасно, використовуючи наступний синтаксис :

command &> file

що простіше набрати, ніж еквівалентну команду в синтаксисі Bourne shell

command > file 2>&1

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

Синтаксис регулярних виразів такий же, що і задокументований на сторінках документації regex. Статус виходу вищезазначеної команди 0 якщо перерахування regex це рядок, 1 якщо це не так. До введених підвиразів в регулярному виразі можна дістати доступ, використовуючи змінну командного процесора BASH_REMATCH, як показано нижче:

if  abcfoobarbletch =~ 'foo(bar)bl(.*)' 
then
  echo The regex matches!
  echo $BASH_REMATCH      -- outputs: foobarbletch
  echo ${BASH_REMATCH[1]} -- outputs: bar
  echo ${BASH_REMATCH[2]} -- outputs: etch
fi

Цей синтаксис діє швидше, ніж виконаня команди grep, бо відповідний регулярний вираз міститься в межах процесу Bash. Якщо регулярний вираз або рядок містять пропуски або метасимволи (такі як '*' or '?'), вони повинні бути поміщені в лапки.

[ред.] Розширення дужок

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

[ред.] Посилання

Особисті інструменти