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", что значит "родился", отсюда: рожденная-вновь командная оболочка.


1. Синтаксис

Синтаксис команд bash - это надмножеством синтаксиса команд Bourne shell. Окончательная спецификация синтаксиса команд Bash есть в Bash Reference Manual, распространяющий проект GNU.

1.1. "Hello world"

 #! / Bin / bash  echo  Hello World  ! 

Этот скрипт содержит только две строки. Первый сообщает системе о том, какая программа используется для запуска файла. Вторая строка - это единственное действие, которое выполняется этим скриптом, он собственно печатает 'Hello world' на терминале.

1.2. Условный оператор

 #! / Bin / bash  T1  =  "Foo"  T2  =  "Bar"  if  [  "  $ T1  "  =  "  $ T2  "  ]  ;  then  echo  условие выполняется  else  echo  условие не выполняется  fi 

1.3. Циклы

 #! / 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 

2. Отличный синтаксис

Подавляющее большинство важных скриптов командного процессора Bourne могут выполняться без изменения в bash, за исключением тех скриптов Bourne, которые ссылаются на специальные переменные Bourne или используют встроенные команды Bourne. Синтаксис команд Bash включает идеи, одолженные у Korn shell ( ksh) и C shell ( csh), такие как редактирование командной строки, история команд, стек директорию, переменные $RANDOM и $PPID, и синтаксис замены команды POSIX : $(?). Когда Bash используется как интерактивный командный процессор, он поддерживает автозавершение имен программ, имен файлов, имен переменных и т.п., если пользователь нажимает клавишу TAB.


2.1. Целочисленная математика

Главное ограничение 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).


2.2. Перенаправление потоков

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"  ) 

2.3. Регулярные выражения внутри процесса

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 воспринимает ваш регулярное выражение.


2.4. Расширение скобок

Возможность расширения скобок заимствовано в 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 

3. Переносимость

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


4. Сноски

  1. GNU Project. "README file". "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)"