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, як скриптову оболонку за умовчанням, що призвело до числених недієздатних скриптів.
[ред.] Посилання
- Bash home page
- Bash Guide for Beginners
- Advanced Bash Scripting Guide
- Bash Debugger
- Learning the shell.
- 2008 interview with GNU Bash's maintainer, Chet Ramey
- Bash Online Forum
|
|
|
|---|---|
| Файлові системи: | chroot · dd · df · fdisk · fsck · mount |
| Файли і каталоги: | cat · chattr · cd · chmod · chown · chgrp · cksum · cmp · cp · du · file · fuser · ln · ls · lsof · mkdir · mv · pwd · rm · rmdir · split |
| Процеси: | at · cron · exit · kill · killall · nice · pgrep · pidof · pkill · ps · sleep · time · top · wait · watch |
| Користувачі: | env · finger · id · logname · mesg · passwd · su · sudo · uname · uptime · w · wall · who · whoami · write |
| Мережа: | arp · dig · ftp · ifconfig · inetd · ip · nc · netstat · nmap · nslookup · ping · rlogin · route · ssh · tcpdump · traceroute · wget |
| Тексти: | awk · comm · cut · ed · ex · fmt · head · iconv · join · less · more · paste · sed · sort · tac · tail · tr · uniq · wc · xargs |
| Командний рядок: | basename · bash · bind · echo · expr · false · printf · test · true · unset |
| Друк: | lp |
| Пошук: | find · grep · strings |
| Різне: | banner · bc · cal · man · size · yes |