Командный интерпретатор BASH

Bash — популярный командный интерпретатор, используемый в юниксоподобных системах, например, в GNU/Linux. Это программа, которую называют оболочка либо шелл (shell), а само название «bash» является сокращением от «Bourne Again Shell».

Интерпретатор Bash принимает команды, передавая их операционной системе. Чтобы осуществлялось взаимодействие с ОС, применяются терминалы (gnome-terminal, nxterm и прочие).

Основные команды

1. man

Отображает руководства по командам. К примеру, последующая команда выдаст все данные о команде cat:

$ man cat
2. cat

Cчитывает файл, переданный в качестве аргумента, с выводом его содержимого по стандартному каналу вывода. При передаче нескольких файлов в виде аргумента происходит вывод конкатенированного содержимого всех файлов.

3. echo

Осуществляет вывод своих аргументов по стандартному каналу вывода. Пример:

$ echo Hello World
  Hello World
4. head

Читает лишь первые десять строк любого переданного текста, выводя их по стандартному каналу. Можно изменить количество выводимых строк:

$ head -50 test.txt
5. tail

Работает аналогично head, однако читает строки с конца:

$ tail -50 test.txt

Дополнительно есть возможность просматривания добавляемых к файлу строк в режиме реального времени, используя флаг -f:

$ tail -f test.txt
6. less

Позволяет перемещаться куску текста либо переданному файлу в обоих направлениях.

$ less test.txt
$ ps aux | less

7. true и false

Первая всегда возвращает ноль в качестве выходного статуса для индикации успеха, вторая, соответственно, не ноль в качестве выходного статуса для индикации неудачи.

$? — это переменная, содержащая выходной статус последней запущенной команды. Выходной статус — код возврата программы. Пример:

$ true
$ echo $?
  0
$ false
$ echo $?
  1
8. grep

Служит для поиска переданной строки в указанном файле. Пример:

$ cat users.txt
  user:student password:123
  user:teacher password:321
$ grep 'student` users.txt
  user:student password:123
9. sed

Потоковый редактор, который преобразует входные текстовые данные. Используется для замены выражений следующим образом: s/regexp/replacement/g. К примеру, в следующем коде произойдёт замена всех слов «Hello» на «Hi»:

$ cat test.txt
  Hello World
$ sed 's/Hello/Hi/g' test.txt
  Hi World
10. history

Выводит историю командной строки. Часто используется совместно с grep при поиске конкретной команды. В коде ниже будут найдены все команды, которые содержат строку g++:

$ history | grep g++
  155  g++ file1.txt
  159  g++ file2.txt
11. export

Устанавливает переменные окружения для их передачи дочерним процессам. Допустим, так мы можем передать переменную name, имеющую значение vasya:

$ export name=vasya
12. ps

Выводит данные о запущенных процессах. Пример:

$ ps
  PID TTY          TIME CMD
  35346 pts/2    00:00:00 bash
13. awk

Находит и меняет текст в файлах на основании заданного шаблона:

awk 'pattern {action}' test.txt
14. wget

Закачивает файлы из интернета, помещая их в текущий каталог.

15. ping

Служит для тестирования сетевого подключения. Пример:

$ ping google.com
  PING google.com (74.125.224.34) 56(84) bytes of data.
  64 bytes from lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms
  --- google.com ping statistics ---
  1 packets transmitted, 1 received, 0% packet loss, time 8ms
  rtt min/avg/max/mdev = 7.794/8.422/10.792/0.699 ms

Статистика в конце отображает число подключений, которые были совершены до завершения команды.

Запустить оболочку в не интерактивном режиме можно с помощью команд:

sh скрипт
bash скрипт

Комментарии

Сценарии могут содержать комментарии. Комментарии – это операторы, их можно размещать в сценарии оболочки, но который игнорируется при исполнении. Комментарии должны начинаются с символа # и продолжаются до символа новой строки. Например:

#!/bin/bash
# Сценарий выведет имя пользователя
whoami

Переменные

Оболочка позволяет создавать и удалять переменные, а также выполнять операции над ними. Переменные в bash могут находиться в 3-х областях видимости:

Локальные переменные – это обычные переменные внутри одного сценария. Они не доступны другим программам и сценариям, которые запускаются с этой оболочки.

Объявляются переменные с помощью символа = (перед и после= нет пробелов), а к их значениям обращаются с помощью символа $:

name="Вася"
echo $name # вывод значения
unset name # вывод переменной

В bash есть много переменных окружения, которые достаточно часто встречаются в сценариях, например:

HOME - путь к домашнему каталогу пользователя;
PATH - список каталогов, в которых оболочка ищет исполняемые файлы;
PWD - путь к рабочему каталогу;
RANDOM - формирует целое случайное число;
HOSTNAME - имя компьютера, на котором выполняется оболочка.

Переменные оболочки – это переменные, которые устанавливаются оболочкой и необходимы ей для корректной работы. Эти переменные имеют имена порядкового номера ($ 1, $ 2, $ 3, …) и содержат аргументы, которые передавались сценарию при запуске, как:

./some_script.sh VAL1 VAL2 # внутри сценария $1='VAL1', $2='VAL2'

Массивы и списки

В bash также есть возможность работы с массивами. При работе с ними часто пользуются переменной окружения IFS – разделителя полей для входных строк (IFS – Input Field Separator).

По умолчанию IFS равен символу пробела, но может быть изменен для разбиения строки на элементы массива, например, запятыми. Объявить массив можно следующим образом:

files[0]=Гараж
files[1]=Котел
echo ${files[*]} # напечатает элементы массива без учета
IFS echo ${files[@]} # напечатает элементы массива с IFS в качестве разделителя

Получить доступ к элементу массива можно с помощью срезов: $ {arr: 0: 1}. Удалить первый элемент массива можно с помощью сдвига: shift arr. Добавить в элементы в массив: arr = (“$ {arr [@]}” “Item 1” “Item 2”).

Результаты операций

Присвоить переменной результат работы команды или арифметических операций можно с помощью апострофов, или конструкции $ (выражение):

now=`data +%T`
# или
now=$(data +%T)
echo now # 14:06:24

Арифметические операции необходимо помещать в двойные скобки:

foo=$(( ((10 + 5*3) – 7) / 2 ))
echo $foo #> 9

Потоки

Файл с которого происходит чтение, называют стандартным потоком ввода, а тот в который происходит запись, соответственно – стандартным потоком вывода. В bash есть три стандартных потока:

0 stdin ввод
1 stdout вивод
2 stderr поток ошибок

Для перенаправления потоков используют основные операторы:

> - перенаправление потока вывода в файл (файл будет создан, или перезаписан)
>> - дописать поток вывода в конец файла;
< - перенаправляет данные из файла в поток ввода;
<<< - чтение данных из строки, вместо всего содержимого файла (работает для bash 3+)
2> - перенаправляет поток ошибок в файл (файл будет создан, или перезаписан)
2>> - дописать ошибки в конец файла.

Каналы

Стандартные потоки можно перенаправить не только в файлы, но и на вход других сценариев. Соединение потока вывода одной программы с потоком ввода другой называют каналом или пайпом (pipe).

Ниже приведен простой конвейер из трех команд: команда1 перенаправляет свой вывод на вход команды2, которая, в свою очередь, перенаправляет собственный вывод на вход команды3:

cmd1 | cmd2 | cmd3

Конвейеры

Конвейеры – это команды, которые соединены операторами ;,&&, ||для выполнения в определенной последовательности.

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

В bash поддерживаются два оператора ветвления: if и case. Оператор if выполняет определенный блок указаний, в зависимости от условия.

Условие помещают в двойные квадратные скобки [[ … ]], которые bash рассматривает как один элемент с кодом выхода.

Внутри блока операторов помещенных в [[ ]] разрешается использовать операторы && и ||. Например:

# Однострочная запись
if [ ... ]; then echo "true"; else echo "false"; fi;

## Вложенные условия
if [ ... ] && [ ... ]; then
     ...
elif [[ ... && ... ]]; then
     ...
else
     ...
fi;

Если необходимо сделать выбор из нескольких альтернатив, пригодится оператор case. Принцип его работы:

case "$ext" in
    (jpg|jpeg)
        echo "Это изображение в формате jpeg."
    ;;
    png)
        echо "Это изображение в формате png"
    ;;
    gif)
         echo "А это ))"
    *)
        echo "Оу! Это вообще не изображение!"
    ;;
esac

В примере оператор проверяет значение переменной $ext на совпадение с одним из шаблонов и в случае совпадения выполнит соответствующий блок кода.

Циклы

Bash дает пользователю возможность организовывать циклическое выполнение инструкций при помощи циклов: *

while
for
*select
while

Оператор while описывается следующим образом:

while условие do
     тело
done

Интерпретатор в первую очередь выполняет команды, описанные в условии. Если результат выполнения нулевой, то выполняется тело, а после ее выполнения, переход к следующей итерации, в противном случае происходит выход из цикла.

for

Цикл for выполняет тело для каждого элемента из списка. Синтаксис цикла for:

for имя in элемент1 элемент2 ... элементN do
     тело
done

В качестве элементов обычно используют различные шаблоны (wildcards). Очень удобно применять for для прохождения по каталогам и выполнения операций над группой файлов.

select

Цикл select помогает организовать удобное меню выбора и применяется тогда, когда пользователь должен выбрать один элемент из предложенного списка. В общем цикл select имеет такой же синтаксис, как и цикл for:

select ответ in элемент1 элемент2 ... элементN do
     тeло
done

При выполнении этого оператора, все элементы из списка высвечиваются на экране со своими порядковыми номерами в виде списка вариантов ответа, после списка выводится специальное приглашение для ввода.

Функции

Объявление функции имеет следующий вид:

Имя функции () {
     команды
}
Имя функции    # обращение к функции

Объявление функции обязательно должно предшествовать ее первый вызов. Обращение к функции происходит путем указания ее имени в качестве команды.

Функция может принимать аргументы и возвращать после своего выполнения результат – код выхода. Функция обращается к своим аргументам точно так же, как и к локальным переменным, с помощью позиционных переменных – $1, $2 и тд.

Результат работы можно возвращать с помощью команды return.

Отладка сценариев

Оболочка дает несколько средств для отладки сценариев. Для активации режима отладки, он должен быть запущен с помощью специальных опций. Первая строка сценария должна иметь вид:

#!/bin/sh опция

Можно выбирать среди следующих функций:

–n - читать все команды, но не выполнять их;
–v - выводить все строки по мере их обработки интерпретатором;
*–x- выводить все команды и их аргументы по мере их выполнения.

Для отладки сценария частями, нужный фрагмент отмечают вызовом команды set с помощью соответствующей опции из таблицы.

Причем, для включения режима отладки, перед опцией указывают символ -, для отключения режима отладки используют +:

set –x # включаем  режим отладки
...
set +x # выключаем режим отладки
 
Поделиться в facebook
Facebook
Поделиться в twitter
Twitter
Поделиться в vk
VK
Поделиться в google
Google+
Поделиться в email
Email

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Группа в VK

Помощь проекту

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Похожие статьи

Команда Netcat в Linux

Команда Netcat в Linux

Netcat (nc) – это утилита командной строки, которая читает и записывает данные через сетевые подключения, используя протоколы TCP или UDP. Это одна из самых мощных

 

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: