BASH. Справочное пособие - Вячеслав Вячеславович Ткачев


Вячеслав Ткачев

BASH. Справочное пособие

Глава1. Оболочка общие сведения.

В процессе загрузки операционных систем семейства Linux, после загрузки ядра системы выполняется переход в интерактивный режим режим взаимодействия пользователя и операционной системы. В ОС Linux, первым запускаемым в ходе загрузки процессом, является программа инициализации init, которая определяет перечень и характеристики терминалов, имеющихся в системе, и вызывает программу интерактивного входа getty, отображающую приглашение для ввода имени пользователя. После ввода имени пользователя и пароля, программа getty вызывает программу login, которая проверяет достоверность учетной записи, выполняет переход в домашний каталог пользователя и передает управление программе начального запуска сеанса, в качестве которой обычно используется программа оболочки пользователя, конкретная разновидность которой определяется содержимым файла /etc/passwd для данной учетной записи.Командная оболочка (shell) обеспечивает взаимодействие между пользователем и средой операционной системы Linux. Она является специализированным программным продуктом, который обеспечивает выполнение команд и получения результатов их выполнения, или, если совсем уж упрощенно, оболочка это программа, которая предназначена для обеспечения выполнения других программ по желанию пользователя. Примером оболочки может быть, например, интерпретатор команд command.com операционной системы MS DOS, или оболочка bash операционных систем Unix / Linux. Оболочка Bash представляет средства для написания сценариев оболочки.

Оболочка читает свой ввод ....

Оболочка разбивает входные данные на токены:

слова и операторы.

Оболочка анализирует ввод в простые и составные

команды.

Оболочка выполняет различные расширения (отдельно)

Оболочка выполняет перенаправление и удаляет

операторы перенаправления и их операнды из

списка параметров.

Оболочка выполняет функцию, встроенный,

исполняемый файл или скрипт

Оболочка по желанию ожидает завершения

команды и собирает статус выхода.

1.1 Краткий обзор функциональных средства.

В оболочке Bash предоставляются следующие функциональные средства и возможности

Переадресация ввода-вывода.

Применение метасимволов для сокращения имен файлов. Переменные и параметры для специальной настройки рабочей среды. Встроенный набор команд для написания программ оболочки. Функции и оболочки для модульной организации задач.

Управление заданиями.

Редактирование (редакторы vi ,Emacs).

Доступ к предыдущим командам.

Арифметические операции.

Массивы и арифметические выражения.

Применение псевдонимов и другие средства.

1.2 Вызов оболочки.

Интерпретатор команд оболочки можно вызвать

bash [параметры ][аргументы ]

Путь к оболочке по ссылке /bin/sh.

Команды оболочки можно выполнять с терминала, из файла (когда в качестве первого аргумента указан сценарий).Исходные оболочки читают содержимое файлов etc/profile и . profile profile

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))

# and Bourne compatible shells (bash(1), ksh(1), ash(1), ).

if [ "${PS1-}" ]; then

if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ];

Примечание

$ echo $PS1-

${debian_chroot:+($debian_chroot)}\u@\h:\w\$ -

$ echo $BASH-

/bin/bash-

$ echo $BASH

/bin/bash

then

# The file bash.bashrc already sets the default PS1.

# PS1='\h:\w\$ '

if [ -f /etc/bash.bashrc ]; then

. /etc/bash.bashrc

fi

else

Следующий фрагмент кода определяет форму приглашения для root # для user $

if [ "`id -u`" -eq 0 ]; then

PS1='# '

else

PS1='$ '

fi

fi

fi

Следующий фрагмент кода запускает один за другим всескрипты в каталоге /etc/profile.d

if [ -d /etc/profile.d ]; then

for i in /etc/profile.d/*.sh; do

if [ -r $i ]; then

. $i

fi

done

unset i

fi

Глава 2 Синтаксис.

2.1.Специальные файлы.

Оболочка читает содержимое одного или нескольких файлов запуска.

/etc/profile Автоматически при входе в систему

~/.bash_profile, ~/.bash_login или ~/.profile

~/.bashrc

~/.bash_logout Выход из системы или команда exit,

2.2 Метасимволы подстановки имен файлов.

* Совпадение с любой строкой.

Пример, перечислить файлы начинающие с output

$ ls output*

output1.wav output2.wav output3.wav output4.wav

? Совпадение с любым символом.

Пример

$ cd video?

~/video1$

[ abc..] совпадение с любым символом в квадратных скобках.

[!abc..] совпадение с любым символом кроме указанных в квадратных скобках.

~ Начальный каталог текущего пльзователя

~max Начальный каталог пользователя max

~+Текущий рабочий каталог ($PWD)

~ Предыдущий рабочий каталог ($OLDPWD).

Пример

~/video1$ cd # Переходим в текущий каталог.

$ cd # Переходим из текущего каталога в предыдущий.

~/video1$

2.3.Метасимволы при установленном параметре extglob.

Активизировать расширение шаблонов командой

shopt (манипулирование параметрами оболочки).

shopt: shopt [-pqsu] [-o] [параметр ]

Set and unset shell options.

Options:

o       restrict OPTNAMEs to those defined for use

with `set -o'

p       print each shell option with an indication

of its status

q suppress output (запретить выход).

s enable (set) each OPTNAME

u disable (unset) each OPTNAME

$shopt -s extglob

$ man shopt

Нет справочной страницы для shopt

?(шаблон) Совпадение с нулевым или единичным

количеством экземпляров заданного шаблона.

*(шаблон) Совпадение с нулевым или большим

количеством экземпляров заданного шаблона.

+(шаблон)Совпадение с единичным или большим

количеством экземпляров заданного шаблона.

@(шаблон) Точное совпадение с одним экземпляром

заданного шаблона.

! (шаблон) Совпадение с любыми символьными

строками не совпадающими с заданным шаблоном

Пример 1 Создадим файл из одной строки

$ cat >fs2.txt

Hello

^d

$ rm fs?(2).txt; cat fs2.txt

cat: fs2.txt: Нет такого файла или каталога

Пример 2

$ cat >fs01.txt

Allo

$ rm fs*(01).txt; cat fs01.txt

cat: fs01.txt: Нет такого файла или каталога

Пример 3

$ cat >fs_lin.txt

Hello friend

$ rm fs@(_lin).txt; cat fs_lin.txt

cat: fs_lin.txt: Нет такого файла или каталога

Пример 4

$ cat >fs_lin.txt

Hello friend

$ rm fs!(lin).txt; cat fs_lin.txt

rm: невозможно удалить 'fs!(lin).txt': Нет такого файла или каталога

cat: fs_lin.txt: Нет такого файла или каталога

2.4 Совпадение с классами символов.

Класс Совпадающие символы

alnum Буквенно-цифровые

alpha Буквенные

ascii Символы в коде ACII

blank Пробелы и знаки табуляции

cntrl Управляющие

digit Десятичные цифры

graph Непробельные

lower Строчные буквы

print Печатаемые

punct Знаки препинания

space Пробельные

upper Прописные буквы

word То же что и alnum

xdigit Шестнадцатиричные цифры

Пример

Эквивалентом выражения "[a-zA-Z_0-9]" является выражение "[[:alnum:]]"

Выражению "[0-9]" эквивалентно выражение "[[:digit:]]"

Выражению "[a-Z]" эквивалентно регулярное выражение "[[:alpha:]

[01[:alpha:]%] совпадает с 0 ,1 ,любым алфавитным символом или %.

2.5 Раскрытие скобок.

Раскрытие скобок выполняется прежде других видов раскрытия выражений, {} не должны заключаться в кавычки. Подстановка команд при раскрытии скобок игнорируется оболочкой BASH.

Пример 1

$ echo hi{BBB,AAA}there

hiBBBthere,hiAAAthere

Пример2

$ echo a{d,c,b}e

ade ace abe

Пример 3

$ echo 1 to 5 is {1..5}

1 to 5 is 1 2 3 4 5

$ echo 1 to 8 by 2 {1..8}

1 to 8 by 2 1 2 3 4 5 6 7 8

Использование скобок ( ) показано на следующем примере выполнение группы команд.

$ (date; w;) Результат

Чт 22 июл 2021 08:31:12 MSK

08:31:12 up 3:00, 1 user, load average: 0,02, 0,14, 0,18

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

max tty2 tty2 05:31 2:59m 0.11s 0.10s /usr/libexec/gn

Использование скобок [ ] и (( )) показано на примере простого скрипта.

$ cat >skobki.sh

#!/bin/bash

X=1

while [ $X -lt 5 ]

do

echo "> $X <"

X=$(( $X+1 ))

done

exit 0

$ chmod +x skobki.sh

$ ./skobki.sh

-> 1 <

-> 2 <

-> 3 <

-> 4 <

2.6 Управляющие последовательности символов.

Распознаются и интерпретируются в следующих контекстах. Символьная строка в форме $ ''

Аргументы в командах echo -e , printf %b

(Подставить управляющие последовательности символов в символьные строки).

Форматирующие строки, указываемые в команде printf ( управляющие последовательности символов в заданном формате экранируются).

\a Звонок

\b Возврат на 1 позицию

\c Подавить знак новой строки

\e Переход

\E Переход

\f Перевод страницы

\n Перевод строки

\r Возврат каретки

\t Табуляция

\uHHHH Символ HHHH в Юникоде

\nnn Восьмиричное значение nnn

\ Одиночная кавычка

\ Двойная кавычка

\? Знак вопроса

\\ Обратная косая черта

Простой пример

$ echo -e "Hello Friend"

Hello Friend

$ echo -e "Hello\nFriend"

Hello

Friend

$ echo -e "Hello Friend" \?

Hello Friend ?

2.7 Формы команд.

Выполнить команду в фоновом режиме $ cmd &.

Выполнить команды группой в текущей оболочке {cmd1; cmd2}.

Пример 1

$ { who;pwd; }

max tty7 2019-08-12 05:17 (:0)

/home/max

Выполнить команды в подоболочке (cmd1 ;cmd2)

Пример 2

$ (date; who; pwd) > logfile

$ cat logfile

Сб авг 3 09:03:21 MSK 2019

max tty7 2019-08-03 08:23 (:0)

/home/max

Передать выход cmd1 на вход cmd2. $ cmd1 | cmd2

Пример 3, найти все файлы с расширением .sh и

сделать их исполняемыми

$ find *.sh -type f |xargs chmod +x

Проверка

$ ls -l *.sh

Результат команды cmd2 как аргумент cmd1.

$ cmd1 `cmd2`

$ cat `pwd`

cat: /home/max: Это каталог

Подстановка команд сmd1 $(cmd2)

Пример 4, создадим файл с датой

$ touch f01 $(date)

$ ls -l f01

rw-rw-r 1 max max 0 авг 3 09:39 f01

Числовой результат в качестве аргумента

cmd $ (выражение)

Логическое И. $ cmd1 && cmd2

Логическое ИЛИ $ cmd1 || cmd2

Логическое НЕ $!cmd

Пример 5

$ date || touch f81.txt; ls f81.txt

Сб 30 мая 2020 06:43:33 MSK

ls: невозможно получить доступ к 'f81.txt': Нет такого файла или каталога

$ date && touch f81.txt; ls f81.txt

Сб 30 мая 2020 06:43:54 MSK

f81.txt

2.8 Простая переадресация ввода-вывода.

Ниже отображены формы переадресации ввода-вывода

cmd>file Направить результат команды в файл.

Пример 1

$ date >f30.txt; cat f30.txt

Вт июн 11 22:10:14 MSK 2019

cmd>> file Добавить результат команды в файл

Пример 2

$ date >>f30.txt; cat f30.txt

Вт июн 11 22:10:14 MSK 2019

Вт июн 11 22:11:45 MSK 2019

cmd <file Взять входные данные для команды из

файла.

Пример 3

$ cat <f30.txt

Вт июн 11 22:10:14 MSK 2019

Вт июн 11 22:11:45 MSK 2019

Пример 4 Встраиваемая строка.

Представить текст заданного слова в качестве входных данных для указанной команды.

$ cat <<<"Privet"

Privet

Пример 5

cmd <>file Записать в файл результат команды,

содержимое файла не нарушается.

$ date <> f30.txt; cat f30.txt

Вт июн 11 21:58:17 MSK 2019

Вт июн 11 17:15:49 MSK 2019

cmd >| file Направить результат команды в файл

Дальше