bash — Вікіпедія

bash
Екран роботи з Bash
ТипКомандна оболонка Unix
АвторБраян Фокс (Brian Fox)
Розробникпроєкт GNU
Перший випуск7 червня 1989; 35 років тому (1989-06-07)
Стабільний випуск5.2.21 (9 листопада 2023; 12 місяців тому (2023-11-09))
ПлатформаGNU
Операційна системакрос-платформовий
Мова програмуванняC
Доступні мовианглійська, багатомовна через gettext
Стан розробкиактивний
ЛіцензіяGNU General Public License version 3+[1]
Онлайн-документаціяgnu.org/software/bash/manual/
Репозиторійgit.savannah.gnu.org/gitweb/?p=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)

Посилання

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