Перейти к основному содержимому

Справочник по командам и синтаксису Bash

Разработчику Архитектору

Справочник по командам и синтаксису Bash

Bash (Bourne Again SHell) — это интерпретатор командной строки, реализующий стандарт POSIX и являющийся стандартом де-факто для большинства дистрибутивов Linux и macOS. Интерпретатор обрабатывает текстовые команды, выполняет скрипты, управляет процессами и взаимодействует с операционной системой.

Bash объединяет возможности оболочки Bourne shell (sh) с расширенными функциями Korn shell (ksh) и C shell (csh). Инструмент поддерживает программирование на уровне командной строки, автоматизацию рутинных задач и управление сложными workflows.


Основные элементы синтаксиса

Переменные окружения и локальные переменные

Переменные в Bash хранят данные, которые могут использоваться скриптами или подсистемой. Различают переменные окружения (доступны всем дочерним процессам) и локальные переменные (доступны только текущей оболочке).

# Объявление переменной без пробелов вокруг знака равенства
MY_VAR="значение"

# Чтение значения переменной
echo $MY_VAR
echo "${MY_VAR}" # Использование фигурных скобок при наличии суффикса

# Установка переменной окружения (доступна дочерним процессам)
export MY_EXPORTED_VAR="данные"

# Локальная переменная внутри функции
local LOCAL_VAR="локальное значение"

Список системных переменных окружения:

Имя переменнойОписаниеПример значения
PATHСписок каталогов для поиска исполняемых файлов/usr/bin:/bin:/usr/sbin
HOMEДомашний каталог текущего пользователя/home/user
USERИмя текущего пользователяroot
SHELLПуть к текущему интерпретатору/bin/bash
PWDТекущий рабочий каталог/tmp
OLDPWDПредыдущий рабочий каталог/var/log
LANGЯзык системы и кодировкаru_RU.UTF-8
LC_ALLПереопределение всех категорий локалиC
PS1Формат приглашения командной строки\u@\h:\w\$
PS2Вторичное приглашение (для многострочных команд)>
IFSРазделители символов (по умолчанию пробел, табуляция, перевод строки) \t\n
HISTSIZEКоличество строк в истории команд1000
HISTFILEПуть к файлу истории~/.bash_history
UIDУникальный идентификатор пользователя1000
GIDГрупповой идентификатор пользователя1000
RANDOMГенерация случайного числа34521
SECONDSВремя выполнения сессии в секундах120
BASH_VERSIONВерсия интерпретатора5.1.16
BASHOPTSОпции bashcheckwinsize:cmdhist
BASH_ALIASESМассив алиасов[0]="ls -la"
BASH_ARGCАргументы, переданные скрипту[0]=3
BASH_ARGVЗначения аргументов скрипта[0]="file.txt"
BASH_CMDSКэш путей к командам[0]="grep=/usr/bin/grep"
BASH_COMMANDКоманда, которая выполняется сейчасecho "test"
BASH_LINENOНомер строки в скрипте10
BASH_SOURCEИмена файлов исходного скрипта[0]="script.sh"
BASH_SUBSHELLУровень вложенности подshell0
BASH_VERSINFOДетальная версия bash[0]=5 [1]=1 ...
EUIDЭффективный UID0
GROUPSГруппы, в которых состоит пользователь[0]=1000 [1]=999
DIRSTACKСтек директорий (pushd/popd)[0]="/tmp"
PIPESTATUSСтатус выхода каждой команды в трубе[0]=0 [1]=1
REPLYПеременная для ввода через ready
LINENOНомер текущей строки в скрипте5
PPIDPID родительского процесса1234
SHLVLУровень вложенности shell1
TMOUTТаймаут ожидания ввода300
TIMEFORMATФормат вывода времени выполнения%R%U%S
TERMТип терминалаxterm-256color
TZЧасовой поясEurope/Moscow
MACHTYPEТип машиныx86_64-pc-linux-gnu
OSTYPEТип ОСlinux-gnu
HOSTTYPEТип хостаx86_64
HOSTNAMEИмя хостаserver.local
MAILCHECKИнтервал проверки почты60
MAILPATHПути к почтовым ящикам/var/mail/$user
EMACSФлаг работы в Emacst
BASHOPTSОпции оболочкиcheckwinsize

Специальные символы и операторы

Символы управляют потоком данных, выполнением команд и обработкой ошибок.

СимволНазначениеПример использования
;Разделитель команд на одной строкеcd /tmp; ls
&Запуск команды в фоновом режимеsleep 10 &
&&Выполнить вторую команду, если первая успешнаmkdir dir && cd dir
``
``Передача вывода первой команды во вход второй (труба)
>Перенаправление вывода в файл (перезапись)echo "hi" > file.txt
>>Перенаправление вывода в файл (добавление)echo "hi" >> file.txt
<Перенаправление ввода из файлаsort < Данные.txt
<<Гереподобный ввод (heredoc)cat << EOF
<>Открытие файла для чтения и записиexec 3<>/dev/tcp/host/80
()Группировка команд в подshell(cd /tmp; ls)
{}Группировка команд в текущем shell{ cd /tmp; ls; }
`Подстановка вывода команды (устаревший способ)date = \date``
$()Подстановка вывода команды (современный способ)date=$(date)
!Отрицание логического условия или вызов из истории!ls, if ! true
~Ссылка на домашний каталогcd ~
*Мэтчинг любого количества символов (глоббинг)ls *.txt
?Мэтчинг одного символаls file?.txt
[]Диапазон или набор символовls [a-z].txt
#Комментарий или параметр расширенияecho # комментарий, ${var:-default}
:Ничегонеделательная команда (пустой оператор): # ничего не делает
( )Скобки для арифметических вычислений(( x + y ))
$Разбор параметров, переменных, подстановок$HOME, $@
\Экранирование следующего символаecho \$VAR
'Одиночные кавычки (полная защита от разбора)echo 'Hello $USER'
"Двойные кавычки (разбор переменных, но защита спецсимволов)echo "Hello $USER"

Управление переменными и подстановками

Расширения параметров

Расширения позволяют манипулировать значениями переменных до их использования.

РасширениеОписаниеПримерРезультат
${var}Значение переменной${PATH}содержимое PATH
${var:-word}Если var пуст или не задан, использовать word${VAR:-default}default (если VAR пуст)
${var:=word}Если var пуст или не задан, установить word${VAR:=default}VAR=content, content
${var:?word}Если var пуст или не задан, вывести ошибку${VAR:?missing}ошибка, выход
${var:+word}Если var не пуст, использовать word${VAR:+present}present (если VAR есть)
${#var}Длина строки в переменной${#VAR}число
${var:offset}Подстрока начиная с offset${VAR:2}часть строки
${var:offset:length}Подстрока длиной length${VAR:2:5}часть строки
${var#pattern}Удалить минимальное совпадение pattern слева${VAR#/path/}имя файла
${var##pattern}Удалить максимальное совпадение pattern слева${VAR##*/}имя файла
${var%pattern}Удалить минимальное совпадение pattern справа${VAR%.txt}имя без расширения
${var%%pattern}Удалить максимальное совпадение pattern справа${VAR%%.*}имя до точки
${var/pattern/replacement}Заменить первое совпадение${VAR/foo/bar}замена
${var//pattern/replacement}Заменить все совпадения${VAR//foo/bar}все замены
${!var}Динамическая ссылка на переменную (indirect)name=VAR; ${!name}значение VAR
${var?message}Вывести сообщение при ошибке${VAR:?не задана}ошибка с сообщением
${var+message}Вывести message, если var задано${VAR+есть}есть

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

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

# Синтаксис (( ))
(( x = 5 + 3 ))
(( x++ ))
(( x-- ))
(( x += 10 ))
(( x == y )) # Возвращает статус 0, если равно

# Синтаксис $[ ] (устаревший, но работает)
result=$(( 10 + 5 ))
echo $result

# Битовые операции
(( x & y )) # Побитовое И
(( x | y )) # Побитовое ИЛИ
(( x ^ y )) # Побитовое Исключающее ИЛИ
(( x << 2 )) # Сдвиг влево
(( x >> 2 )) # Сдвиг вправо

Ввод и вывод данных

Команды ввода

Команда read считывает данные из стандартного входа.

ПараметрОписаниеПример
-pВывести приглашение перед чтениемread -p "Введите имя: " name
-rНе интерпретировать обратные слешиread -r line
-sТихий режим (скрыть ввод)read -s password
-tТаймаут ожидания в секундахread -t 5 input
-nЧитать ровно n символовread -n 1 key
-aСохранить слова в массивread -a arr
-iИспользовать историю редактированияread -i "предпросмотр" text

Пример использования:

read -p "Имя: " user_name
read -sp "Пароль: " pass
echo ""
echo "Добро пожаловать, $user_name"

Команды вывода

КомандаОписаниеОсобенности
echoВывод текста на экранПоддерживает флаги -n (без перевода строки), -e (интерпретация escape), -E (отключить интерпретацию)
printfФорматированный выводСтрогий контроль формата, аналог C printf
catКонкатенация файлов и вывод-A показать все символы, -n нумерация строк
teeВывод в файл и на экран`command
ddКопирование и преобразование файловif=, of=, bs= (блок size)
yesБесконечный вывод строкиyes "да"

Настройки echo:

echo -n "Нет перевода строки"
echo -e "Строка\nС новой строки\tТабуляция"
echo -E "Не интерпретировать \n"

Форматирование printf:

printf "Число: %d\n" 42
printf "Строка: %s\n" "текст"
printf "Float: %.2f\n" 3.14159
printf "Зачистка: %-10s\n" "text"
printf "Заполнение: %05d\n" 42

Структуры управления

Условные конструкции

Конструкция if проверяет условие и выполняет блок кода.

if [ condition ]; then
commands
elif [ other_condition ]; then
other_commands
else
fallback_commands
fi

Операторы сравнения в [ ]:

ОператорОписание
-eqРавно численно
-neНе равно численно
-gtБольше численно
-geБольше или равно численно
-ltМеньше численно
-leМеньше или равно численно
==Равно строкам (или числам)
!=Не равно строкам
<Меньше лексикографически
>Больше лексикографически
-zСтрока пуста
-nСтрока не пуста
-fФайл существует и является обычным файлом
-dКаталог существует
-xФайл имеет права на выполнение
-rФайл доступен для чтения
-wФайл доступен для записи
-sФайл не пуст
-eФайл или каталог существует
-OВладелец файла
-GГруппа файла
=~Регулярное выражение (в [[ ]])

Операторы логические:

ОператорОписание
&&И (оба условия истинны)
`
!НЕ (отрицание)

Пример:

if [[ -f "file.txt" && -r "file.txt" ]]; then
cat file.txt
fi

Циклы

Цикл for

Цикл перебирает список элементов.

# По списку
for item in list_of_items; do
echo "$item"
done

# С использованием glob
for file in *.txt; do
echo "Обработка: $file"
done

# Классический цикл C
for (( i=0; i<10; i++ )); do
echo "Счетчик: $i"
done

Цикл while

Цикл выполняется, пока условие истинно.

while [ условие ]; do
команды
done

# Пример бесконечного цикла с проверкой
while true; do
read -p "Выход? (y/n) " ans
if [ "$ans" == "y" ]; then
break
fi
done

Цикл until

Цикл выполняется, пока условие ложно (противоположность while).

until [ условие ]; do
команды
done

Цикл select

Меню выбора из списка.

select option in "Пункт 1" "Пункт 2" "Пункт 3"; do
case $option in
1|2|3)
echo "Выбрано: $option"
break
;;
*)
echo "Неверный выбор"
;;
esac
done

Управляющие ключевые слова

Ключевое словоОписание
breakВыход из цикла
continueПропуск оставшейся части тела цикла, переход к следующей итерации
returnВыход из функции с кодом возврата
exitВыход из скрипта с кодом возврата
execЗамена текущего процесса командой (не создает новый процесс)
trapРегистрация обработчика сигналов
setНастройка опций оболочки
shiftСдвиг позиций позиционных параметров
evalВыполнение строки как команды
sourceИсполнение скрипта в текущем контексте (.)

Функции

Функции позволяют группировать команды и переиспользовать код.

# Объявление функции
function_name() {
local_var="значение"
# Логика функции
return 0
}

# Вызов функции
function_name arg1 arg2

Особенности передачи аргументов:

  • $1, $2, ... — первые, вторые аргументы
  • $# — количество аргументов
  • $@ — все аргументы как отдельные слова
  • $* — все аргументы как одна строка
  • $? — код возврата последней команды
  • $0 — имя скрипта или функции

Пример функции с локальными переменными:

calculate_sum() {
local a=$1
local b=$2
local result=$((a + b))
echo "Результат: $result"
return 0
}

sum=$(calculate_sum 5 10)

Работа с файлами и потоками

Стандартные потоки

ПотокОписаниеНомер дескриптора
stdinСтандартный ввод0
stdoutСтандартный вывод1
stderrСтандартный вывод ошибок2

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

# Перенаправить stderr в stdout
command 2>&1

# Перенаправить stdout в файл, stderr в другой файл
command > out.txt 2> err.txt

# Перенаправить оба потока в один файл
command > both.txt 2>&1

# Перенаправить stdin из файла
command < input.txt

# Открыть файл на чтение и запись
exec 3< input.txt
exec 4> output.txt

Команды работы с файлами

КомандаОписание
touchСоздать пустой файл или обновить время модификации
mkdirСоздать каталог (-p создать вложенные)
rmУдалить файлы (-r рекурсивно, -f без подтверждения)
cpКопировать файлы (-r для каталогов)
mvПереместить или переименовать
lnСоздать ссылку (-s для символической)
chmodИзменить права доступа
chownИзменить владельца
chgrpИзменить группу
statОтобразить информацию о файле
fileОпределить тип файла
findПоиск файлов по критериям
locateБыстрый поиск по базе данных
dfСвободное место на дисках
duРазмер файлов и каталогов
wcПодсчет строк, слов, символов
headПервые N строк
tailПоследние N строк (-f следить за изменением)
cutВырезание колонок
sortСортировка строк
uniqУдаление повторяющихся строк
grepПоиск шаблонов в файлах
sedРедактор строк
awkТекстовый процессор

Практические примеры:

# Поиск файлов с расширением .log старше 7 дней
find /var/log -name "*.log" -mtime +7

# Подсчет строк в файле
wc -l file.txt

# Удаление пустых файлов в каталоге
find . -type f -empty -delete

# Копирование только изменившихся файлов
rsync -av source/ dest/

Обработка ошибок и сигналов

Коды возврата

Каждая команда возвращает код состояния (0 — успех, 1-255 — ошибка).

command
echo $? # Проверка кода

Обработка сигналов

Команда trap регистрирует обработчики для сигналов.

trap 'echo "Произошла ошибка!"; exit 1' ERR
trap 'echo "Завершение..."; rm -f temp.txt' EXIT
trap 'echo "Прервано Ctrl+C"; exit 130' INT TERM

Основные сигналы:

СигналКодОписание
INT2Прерывание (Ctrl+C)
TERM15Обычное завершение
HUP1Перезагрузка терминала
KILL9Принудительное завершение (нельзя перехватить)
STOP19Пауза (Ctrl+Z)
CONT18Продолжение после паузы
USR110Пользовательский сигнал 1
USR212Пользовательский сигнал 2

Отправка сигнала:

kill -9 PID
kill -s TERM PID

Опции оболочки (Set Options)

Команда set включает или отключает специальные режимы работы.

ОпцияОписаниеВключение/Выключение
-eВыход при любой ошибкеset -e / set +e
-uОшибка при обращении к неопределенной переменнойset -u / set +u
-o pipefailВыход при ошибке в любой команде трубыset -o pipefail
-nТолько проверка синтаксиса (не выполнять)set -n
-vВывод команд перед выполнениемset -v
-xВывод команд с параметрами (отладка)set -x
-eВыход при ошибкеset -e
-fОтключить глоббинг (расширение имен файлов)set -f
-hОбновлять кэш путей к командамset -h
-mРежим мониторинга (для job control)set -m
-TСледить за перемещением функцийset -T
-BСледить за перемещением бэкграунд-процессовset -B
-CЗапретить перезапись файлов при перенаправленииset -C
-DВключить трассировку макросовset -D
-EНаследовать ловушки в подshellset -E
-IИгнорировать ошибки в подстановкахset -I
-PНе следовать символическим ссылкамset -P
-tВыход после выполнения одной командыset -t
-TОтслеживать изменения функцийset -T
-uОшибка при использовании неопределенной переменнойset -u
-vВывод команд перед выполнениемset -v
-xВывод команд с параметрамиset -x
-aАвтоматический экспорт переменныхset -a
-bСообщать о завершении фоновых процессовset -b
-gПередача переменных в глобальную областьset -g
-iИнтерактивный режимset -i
-kПараметры после -- считаются аргументамиset -k
-oВключить опциюset -o option
-pПривилегированный режим (сохранять права)set -p
-rЗапрет на изменение переменныхset -r
-sЧтение команд из stdinset -s
-tВыход после одной командыset -t
-vВывод командset -v
-xОтладкаset -x

Пример безопасного скрипта:

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

Массивы

Bash поддерживает одномерные массивы.

# Создание массива
arr=(element1 element2 element3)

# Доступ к элементам
echo "${arr[0]}"
echo "${arr[@]}" # Все элементы
echo "${#arr[@]}" # Количество элементов
echo "${!arr[@]}" # Индексы элементов

# Добавление элементов
arr+=("new_element")

# Срез массива
echo "${arr[@]:1:2}" # Элементы с 1 по 2 шт.

# Замена элементов
arr[1]="replaced"

# Удаление элемента
unset arr[1]

Регулярные выражения

Bash использует регулярные выражения в условиях [[ ]] и командах grep, sed, awk.

Операторы в [[ ]]:

ОператорОписание
=~Совпадение с регулярным выражением
==Строковое сравнение (может содержать *, ?, [])

Пример:

if [[ $filename =~ ^data_\d{4}.csv$ ]]; then
echo "Файл соответствует шаблону"
fi

Символы регулярных выражений:

СимволОписание
.Любой символ кроме новой строки
^Начало строки
$Конец строки
*0 или более предыдущих символов
+1 или более предыдущих символов
?0 или 1 предыдущий символ
[]Набор символов
[^]Отрицание набора
``
()Группировка

Жёсткие ссылки и символические ссылки

Тип ссылкиОписаниеОсобенности
Жёсткая ссылкаАльтернативное имя того же inodeРаботает только в пределах одной файловой системы, нельзя создавать для каталогов, удаление оригинала не удаляет данные, пока есть ссылки
Символическая ссылкаСсылка на путь к файлуМожет указывать на удаленный файл, может работать между файловыми системами, содержит путь, а не inode

Создание:

ln original hard_link # Жёсткая
ln -s target soft_link # Символическая

Системные вызовы и утилиты

Команды управления процессами

КомандаОписание
psИнформация о процессах
topМониторинг ресурсов в реальном времени
htopИнтерактивный мониторинг
killОтправка сигналов процессам
pkillОтправка сигналов по имени
pgrepПоиск PID по имени
jobsСписок фоновых задач
fgПеревод задачи вForeground
bgПеревод задачи вBackground
waitОжидание завершения фоновых задач
nohupЗапуск процесса, игнорирующего SIGHUP
disownУдаление задач из таблицы оболочек

Пример:

nohup ./long_running_script.sh > output.log 2>&1 &
disown %1

Команды сети

КомандаОписание
pingПроверка доступности узла
netstatСтатистика сети
ssСостояние сокетов
curlПередача данных по сети
wgetСкачивание файлов
sshБезопасное подключение
scpКопирование по SSH
rsyncСинхронизация файлов
telnetТестирование портов (устарело)
ncNetcat (универсальный инструмент)

Пример curl:

curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com

Команды безопасности

КомандаОписание
passwdИзменение пароля
sudoВыполнение команд от имени суперпользователя
suПереключение пользователя
chmodИзменение прав доступа
chownИзменение владельца
umaskМаска прав по умолчанию
gpgШифрование и подпись
opensslКриптографические инструменты
iptablesНастройка правил фаервола
firewalldУправление фаерволом

Установка umask:

umask 022 # Права по умолчанию: 755 для каталогов, 644 для файлов

Продвинутые техники

Heredoc и Here-string

Heredoc:

cat << EOF
Строка 1
Строка 2
EOF

Here-string:

echo "Строка" | while read line; do
echo "Обработка: $line"
done

Процессные подстановки

# Сравнение двух файлов
diff <(sort file1) <(sort file2)

# Чтение из процесса
while read line; do
echo "$line"
done < <(ps aux | grep python)

Команды подстановки

# Выполнение команды и подстановка результата
files=$(ls *.txt)
echo "Файлов: $files"

Оптимизация скриптов

  • Использование local для переменных в функциях.
  • Минимизация создания подshell (использование { } вместо ( )).
  • Применение case вместо цепочки if/elif.
  • Использование declare для явного объявления типов.
  • Избегание повторных вызовов тяжелых команд в циклах.

Примеры сложных сценариев

Парсинг аргументов командной строки

while getopts "h:v:f:" opt; do
case $opt in
h) echo "Помощь";;
v) verbose=true;;
f) filename="$OPTARG";;
\?) echo "Неизвестный флаг";;
esac
done
shift $((OPTIND-1))

Обработка ошибок в цикле

for file in *.txt; do
if ! mv "$file" "backup_$file"; then
echo "Ошибка при обработке $file" >&2
continue
fi
done

Работа с JSON (через jq или python)

# Использование jq для парсинга JSON
json_data='{"name": "Test", "count": 5}'
name=$(echo "$json_data" | jq -r '.name')
echo "Имя: $name"

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).

Освоение главы0%