bash






























bash

Gnu-bash-logo.svg

Bash demo.png
Екран роботи з Bash

Тип
Командна оболонка Unix
Автор(и)
Браян Фокс (Brian Fox)
Розробники
GNU Project[d] і Chet Ramey[d]
Перший випуск
7 червня 1989; 10911 днів тому
Стабільний випуск
4.2 (27 лютого 2014; 1880 днів тому)
Репозиторій
git.savannah.gnu.org/cgit/bash.git
Платформа
GNU
Операційна система
крос-платформовий
Написано на
C
Доступні мови
англійська, багатомовна через gettext
Стан розробки
активний
Ліцензія
GNU General Public License version 3+[1]
Онлайн-документація
gnu.org/software/bash/manual/

домашня сторінка


bash у Вікісховищі?

|source model=


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» — «народжений знову».




Зміст





  • 1 Синтаксис

    • 1.1 «hello world»


    • 1.2 Умовний оператор


    • 1.3 Цикли



  • 2 Відмінний синтаксис

    • 2.1 Цілочисельна математика


    • 2.2 Перенаправлення потоків


    • 2.3 Регулярні вирази всередині процесу


    • 2.4 Розширення дужок



  • 3 Переносимість


  • 4 Виноски


  • 5 Посилання




Синтаксис |


Синтаксис команд 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).



Перенаправлення потоків |


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 ap,c,d,be # ape ace ade abe

Не слід використовувати цю особливість, якщо скрипт планується портувати, бо в традиційних скриптах розширення рядка не діятиме:


 # A traditional shell does not produce the same output
echo ap,c,d,be # ap,c,d,be


Переносимість |


Скрипти оболонок, написані зі специфічними для bash особливостями (bashism-и) не будуть працювати на системах, де використовується Bourne shell або один із його замінників, без того, щоб bash був встановлений як додаткова оболонка, і звісно, скрипти треба починати з #!/bin/bash. Ця проблема стала особливо важливою, коли Ubuntu почав із жовтня 2006, поставляти Debian Almquist shell, dash, як скриптову оболонку за умовчанням, що призвело до недієздатності численних скриптів.



Виноски |




  1. GNU Project. README file. Архів оригіналу за 2013-06-26. Процитовано 2011-02-03. «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 (англ.)


  • Bash Guide for Beginners (англ.)


  • Advanced Bash Scripting Guide (англ.)


  • Learn X in Y minutes Where X=bash (англ.)

  • Конспект по Bash


  • Bash Debugger (англ.)


  • Learning the shell. (англ.)


  • 2008 interview with GNU Bash's maintainer, Chet Ramey (англ.)


  • Bash Online Forum (англ.)


Popular posts from this blog

1928 у кіно

Захаров Федір Захарович

Ель Греко