Bash
Эта статья требует внимания, поскольку она не следует стандартам руководства wiki. Если Вы желаете помочь, пожалуйста, ознакомьтесь с принятыми стандартами. Если у Вас есть какие-либо вопросы, пожалуйста свяжитесь с нами, мы всегда готовы Вам помочь! :-) |
Bash это командный процессор Unix написанный для проекта GNU. Его имя это акроним от Bourne-again shell — игра слов (Bourne again / born again) в Bourne shell (sh), который был ранее очень важным коммандным процессором. Bourne shell распространялся вместе с Unix Version 7, примерно в 1978. Оригинальный Bourne shell был написан Стефаном Борном, который работал исследователем в Bell Labs. Bash shell был написан в 1987 Брайном Фоксом . В 1990, Чет Рамей стал основным мейнтейнером. Bash это командный процессор по умолчанию во многих Linux системах.
Содержание
Основные моменты синтаксиса Bash
Синтаксис команд Bash это надмножество синтаксиса команд Bourne shell. Окончательная спецификация синтаксиса команд Bash есть в Bash Reference Manual, распространяемом проектом GNU. Эта глава выдвигает на первый план некоторые из уникальных особенностей синтаксиса Bash.
Множество важных скриптов командного процессора Bourne могут выполняться без изменения в Bash, за исключением тех скриптов Bourne, которые ссылаются на специальные переменные Bourne или используют встроенные команды Bourne. Синтаксис команд Bash включает в себя идеи скопированные с Korn shell (ksh) и C shell (csh), такие как редактирование командной строки, история команд, стек директории, переменные $RANDOM и $PPID, и синтаксис замены команды POSIX : $(...). Когда Bash используется как интерактивный командный процессор, он поддерживает автозавершение имен программ, имен файлов, имен переменных и т.д., если пользователь нажимает кнопку TAB.
Синтаксис Bash содержит множество расширений, в которых нуждался Bourne shell. Некоторые из них приведены здесь.
Целочисленная математика
Главное ограничение 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(3). Статус выхода вышеупомянутой команды 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 '?'), они должны быть помещены в кавычки.
Обратные escape последовательности
Слова, имеющие форму $'строка' рассматриваются отдельно. Слово расширяется до строки, с помощью символов обратных escape последовательностей, описанных в языке программирования C. Обратные escape последовательности, если присуствуют, декодируются как показано ниже:
Backslash Escape |
Expands To ... |
---|---|
\a | Символ звукового сигнала |
\b | Символ backspace |
\e | Символ escape |
\f | Символ подачи формы |
\n | Символ новой строки |
\r | Символ перевода каретки |
\t | Символ горизонтальной табуляции |
\v | Символ вертикальной табуляции |
\\ | Символ обратного слеша |
\' | Символ одинарной кавычки |
\nnn | Восьмибитный символ , значение которого - восьмеричное значение nnn (one to three digits) |
\xHH | Восьмибитный символ , значение которого - шестнадцатиричное чило HH (one or two hex digits) |
\cx | Символ control-X |
Расширенный результат записан в одинарных кавычках, как будто знак доллара не был указан.
Строка в двойных кавычках, которой предшествует знак доллара ($"...") заставит строку быть переведенной согласно текущему месту действия. Если текущее место действие это C или POSIX, знак доллара игнорируется. Если строка переведена и заменена, указываются двойные кавычки.
Стартовые скрипты Bash
Когда запускается Bash, он выполняет команды, записанные в разнообразных скриптах.
Когда Bash вызывается интерактивной командной оболочкой, либо неинтерактивной оболочкой с параметром --login, он сначала читает и выполняет команды из файла /etc/profile, если он существует. После прочтения этого файла, он в таком порядке ищет ~/.bash_profile, ~/.bash_login, и ~/.profile, читает и выполняет команды из первого, который выполняется и читается. Параметр --noprofile может использоваться, когда командная оболочка препятствует такому поведению.
Когда командная оболочка завершает свою работу, Bash читает и выполняет команды из файла ~/.bash_logout, если он существует.
Когда интерактивная оболочка, не являющаяся командной оболочкой, запускается, Bash читает и выполняет команды из ~/.bashrc, если этот файл существует. Это может быть замедлено параметром --norc. Параметр --rcfile file заставит Bash читать и выполнять каманды из file вместо ~/.bashrc.
Когда Bash запускается неинтерактивно, то для запуска скрипта оболочки, например, он ищет переменную BASH_ENV в среде, расширяет свое значение если он появится там, и использует расширенное значение как имя файла для чтения и выполнения. Bash ведет себя как если бы были выполнены следующие команды:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
но значение переменной PATH не используется для поиска файла.
Если Bash вызывается с параметром sh, он пытается имитировать запуск исторических комманд sh на сколько это возможно, в то время как соответствующий стандарт POSIX так же. Если Bash запущено в качестве интерактивной оболочки, или в форме не интерактивной с --login опцией, это первая попытка на чтение и выполнение команд с /etc/profile и ~/.profile, в таком порядке. Эта --noprofile опция может быть использована для ингибиции. При вызове в качестве интерактивной оболочки с именем sh, Bash смотрит на переменные ENV, на ихнее значение, если переменная определена, и использует расширенное значение как имя файла для записи и выполнения. Пока shell вызывается как sh, то параметр --rcfile не даёт результата. Не интерактивная оболочка вызвана с параметром sh не пытается читать и выполнять команды от любых других файлов запуска. Когда вызвана с sh, Bash входит в posix mode после автозапуска готовых файлов.
Когда Bash запущена в POSIX-режиме, с параметром --posix в командной строке, Это следует POSIX-стандарту для файлов автозапуска. В этом режиме, оболочка дополняется ENV переменной и командами, которые готовы для выполнения с файла, чьё имя и есть эта переменная.
Bash пытается определить когда она будет запущена на remote shell daemon, обычно это rshd. Если Bash опредилит, что оболочка в настоящее время запущена rshd, то читаются и выполняются комманды с ~/.bashrc, если этот файл доступен конечно. Это не произойдет если Bash вызвана с sh. Опция --norc может быть использована для ингибинации такого поведения, и опция --rcfile может быть задействована для записи другого файла, но rshd как правило, не ссылается на оболочку с этими опциями, или чтобы их можно было указать.
Дополнительные ссылки
- Домашняя страница Bash
- Bash FAQ
- Анонс Bash 3.0
- The GNU Bash Reference Manual, (HTML-версия) от Chet Ramey и Brian Fox, ISBN 0954161777
- Debugging with the BASH debugger
Руководства по Bash из Linux Documentation Project:
- Руководство для начинающих по Bash
- Программирование на Bash - Вступление
- Расширеный Bash-Scripting гайд
Другие руководства и учебники: