linux scripting

bash

Командная оболочка Bash (Bourne Again SHell) — интерактивный интерпретатор и язык сценариев

Описание

Bash (Bourne Again SHell) — наиболее распространённая командная оболочка в Linux-системах, разработанная Брайаном Фоксом в 1989 году как свободная замена оболочке Bourne Shell (sh). Bash является стандартной оболочкой во всех дистрибутивах Linux (Debian, Ubuntu, Fedora, Arch) и macOS (до Catalina). Оболочка поддерживает интерактивный режим для пользовательских сессий и неинтерактивный режим для выполнения скриптов.

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

Помимо запуска скриптов, bash можно вызывать явно для указания версии оболочки, изменения параметров среды или запуска команды в изолированном окружении. Используй bash когда нужна максимальная совместимость с bash-специфичными возможностями: массивами, [[-тестами, process substitution, mapfile и другими расширениями сверх POSIX.

Синтаксис

bash [OPTIONS] [SCRIPT] [ARGUMENTS...] bash [OPTIONS] -c "COMMAND_STRING" [ARG0 [ARG1...]] bash [OPTIONS] -s [ARG...]

Флаги и опции

ФлагОписание
-c "cmd"Выполнить строку cmd как команду, затем завершить. Пример: bash -c "echo hello"
-sЧитать команды из stdin. Позволяет передавать скрипт по пайпу: echo 'ls' | bash -s
-xDebug-режим: печатать каждую команду перед выполнением (trace). Незаменим при отладке скриптов
-eЗавершить скрипт немедленно, если любая команда вернула ненулевой код завершения (errexit)
-uСчитать обращение к неустановленной переменной ошибкой (nounset). Защищает от опечаток в именах переменных
-o pipefailВозвращать код ошибки пайпа, если хотя бы одна команда в цепочке завершилась с ошибкой
-nЧитать команды для проверки синтаксиса, но не выполнять их (noexec / dry-run)
-vVerbose: печатать каждую строку скрипта по мере её чтения (до расширения переменных)
-iЗапустить интерактивную оболочку даже если stdin не является терминалом
-lЗапустить как login shell: загрузить /etc/profile, ~/.bash_profile
--noprofileНе загружать системные и пользовательские профильные файлы при старте login shell
--norcНе загружать ~/.bashrc при старте интерактивной неlogin-оболочки
--rcfile FILEЗагрузить FILE вместо стандартного ~/.bashrc
--versionВывести версию Bash и завершить

Паттерны использования

Запуск скрипта с отладкой

# Отладочный запуск скрипта
bash -x deploy.sh production

# Включить несколько режимов сразу
bash -euxo pipefail deploy.sh

# Inline-отладка внутри скрипта
set -euxo pipefail

Выполнение команды из строки

# Одна команда
bash -c "echo \$HOME"

# Несколько команд
bash -c "cd /tmp && ls -la && pwd"

# Передача аргументов в -c
bash -c 'echo "Hello, $1!"' _ World

Проверка синтаксиса без запуска

# Проверить скрипт на ошибки синтаксиса
bash -n myscript.sh

# Ожидаемый вывод при ошибке:
# myscript.sh: line 5: syntax error near unexpected token 'fi'

Shebang и заголовок скрипта

#!/usr/bin/env bash
# Portable shebang — находит bash в PATH

# Строгий режим (рекомендуется всегда)
set -euo pipefail
IFS=$'\n\t'

echo "Script start: $0"
echo "Arguments: $@"

Скрипт с позиционными параметрами

#!/usr/bin/env bash
set -euo pipefail

# Проверить наличие аргумента
if [[ $# -lt 1 ]]; then
  echo "Usage: $0 <name>" >&2
  exit 1
fi

NAME="$1"
echo "Hello, ${NAME}!"

Получить скрипт из сети и выполнить

# Стандартный паттерн установщиков
# (использовать только из доверенных источников!)
curl -fsSL https://example.com/install.sh | bash

# Безопаснее — сначала скачать, проверить, запустить
curl -fsSL https://example.com/install.sh -o install.sh
bash -n install.sh && bash install.sh

Советы и предупреждения

Совет: strict mode для надёжных скриптов
Начинай каждый скрипт с set -euo pipefail. Это включает три защитных режима сразу: выход при ошибке (-e), ошибка на неустановленных переменных (-u), и корректный код выхода пайпа (pipefail). Дополни IFS=$'\n\t' для безопасного разбиения строк.
Совет: использование shellcheck
Инструмент shellcheck статически анализирует bash-скрипты и указывает на распространённые ошибки: непроцитированные переменные, неверные конструкции, устаревший синтаксис. Устанавливается через пакетный менеджер: apt install shellcheck или brew install shellcheck.
Внимание: curl | bash небезопасен
Паттерн curl URL | bash выполняет произвольный код без проверки. Никогда не применяй его для скриптов из ненадёжных источников. Безопасная альтернатива: скачай скрипт, проверь его содержимое, затем запусти. Проверяй хэш-суммы если они опубликованы.
Внимание: bash vs sh
Скрипты с shebang #!/bin/sh могут выполняться разными оболочками (dash, ash, bash). Bash-специфичные конструкции ([[, массивы, $(( )), local) не являются POSIX и могут сломаться. Если скрипт использует bash-расширения — всегда указывай #!/usr/bin/env bash.