Вячеслав Ткачев
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 Направить результат команды в файл