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

Save data to MySQL database using ExtJS and PHP [closed]2019 Community Moderator ElectionHow can I prevent SQL injection in PHP?Which MySQL data type to use for storing boolean valuesPHP: Delete an element from an arrayHow do I connect to a MySQL Database in Python?Should I use the datetime or timestamp data type in MySQL?How to get a list of MySQL user accountsHow Do You Parse and Process HTML/XML in PHP?Reference — What does this symbol mean in PHP?How does PHP 'foreach' actually work?Why shouldn't I use mysql_* functions in PHP?

Compiling GNU Global with universal-ctags support Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Tags for Emacs: Relationship between etags, ebrowse, cscope, GNU Global and exuberant ctagsVim and Ctags tips and trickscscope or ctags why choose one over the other?scons and ctagsctags cannot open option file “.ctags”Adding tag scopes in universal-ctagsShould I use Universal-ctags?Universal ctags on WindowsHow do I install GNU Global with universal ctags support using Homebrew?Universal ctags with emacsHow to highlight ctags generated by Universal Ctags in Vim?

Add ONERROR event to image from jsp tldHow to add an image to a JPanel?Saving image from PHP URLHTML img scalingCheck if an image is loaded (no errors) with jQueryHow to force an <img> to take up width, even if the image is not loadedHow do I populate hidden form field with a value set in Spring ControllerStyling Raw elements Generated from JSP tagds with Jquery MobileLimit resizing of images with explicitly set width and height attributeserror TLD use in a jsp fileJsp tld files cannot be resolved