Bash
Материал из openSUSE.
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 , Чет Рамей стал основным мейнтейнером ( maintainer ). 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 startup scripts
Когда запускается Bash , он выполняет команды , записанные в разнообразных скриптах .
When Bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.
When a login shell exits, Bash reads and executes commands from the file ~/.bash_logout, if it exists.
When an interactive shell that is not a login shell is started, Bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force Bash to read and execute commands from file instead of ~/.bashrc.
When Bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file name.
If Bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well. When invoked as an interactive login shell, or a non-interactive shell with the --login option, it first attempts to read and execute commands from /etc/profile and ~/.profile, in that order. The --noprofile option may be used to inhibit this behavior. When invoked as an interactive shell with the name sh, Bash looks for the variable ENV, expands its value if it is defined, and uses the expanded value as the name of a file to read and execute. Since a shell invoked as sh does not attempt to read and execute commands from any other startup files, the --rcfile option has no effect. A non-interactive shell invoked with the name sh does not attempt to read any other startup files. When invoked as sh, Bash enters posix mode after the startup files are read.
When Bash is started in posix mode, as with the --posix command line option, it follows the POSIX standard for startup files. In this mode, interactive shells expand the ENV variable and commands are read and executed from the file whose name is the expanded value. No other startup files are read.
Bash attempts to determine when it is being run by the remote shell daemon, usually rshd. If Bash determines it is being run by rshd, it reads and executes commands from ~/.bashrc, if that file exists and is readable. It will not do this if invoked as sh. The --norc option may be used to inhibit this behavior, and the --rcfile option may be used to force another file to be read, but rshd does not generally invoke the shell with those options or allow them to be specified.
Дополнительные ссылки
- Bash home page
- Bash FAQ
- Bash 3.0 Announcement
- The GNU Bash Reference Manual, (HTML version) by Chet Ramey and Brian Fox, ISBN 0954161777
- Debugging with the BASH debugger
Bash guides from the Linux Documentation Project:
Other guides and tutorials:

