Bash
Bash
Bash або Bourne Again SHell — це командна оболонка і мова скриптів, яка широко використовується в Linux, Unix-подібних системах, macOS, DevOps, CI/CD, адмініструванні серверів, автоматизації задач, роботі з файлами, логами, процесами, Docker, Git та іншими інструментами командного рядка.
Bash є розвитком класичної оболонки sh і став однією з найпоширеніших shell-оболонок у світі Unix/Linux.
Bash — це інструмент, який дозволяє керувати системою, запускати команди й автоматизувати повторювану роботу через скрипти.
Коротко
| Параметр | Значення |
|---|---|
| Назва | Bash |
| Повна назва | Bourne Again SHell |
| Тип | Командна оболонка і мова скриптів |
| Походження | Розвиток Bourne shell |
| Основні системи | Linux, Unix, macOS, BSD, WSL |
| Файли скриптів | .sh, .bash |
| Головні сфери | DevOps, Linux, сервери, CI/CD, автоматизація, backup, deployment |
| Складність для новачків | Низька для базових команд, середня для скриптів, висока для складної автоматизації |
| Офіційний проєкт | GNU Bash |
Головна ідея Bash
Bash дозволяє вводити команди вручну або записувати їх у файл-скрипт.
Наприклад, вручну можна виконати:
ls -la
Або записати набір команд у файл:
#!/usr/bin/env bash
echo "Починаємо роботу"
mkdir -p backup
cp *.txt backup/
echo "Готово"
Bash перетворює командний рядок на мову автоматизації.
Bash, Shell і Terminal
Ці поняття часто плутають.
| Термін | Що означає |
|---|---|
| Terminal | Програма-вікно, через яку користувач вводить команди |
| Shell | Командна оболонка, яка приймає й виконує команди |
| Bash | Один із найпопулярніших різновидів shell |
| Shell script | Файл із командами shell |
Terminal — це вікно. Bash — це оболонка, яка всередині цього вікна виконує команди.
Для чого використовується Bash
| Напрям | Як використовується Bash | Приклади |
|---|---|---|
| Linux-адміністрування | Керування серверами, файлами, сервісами | systemctl, journalctl, ssh |
| DevOps | Автоматизація deployment, CI/CD, Docker | deploy.sh, build.sh, backup.sh |
| Backend | Запуск сервісів, тестів, міграцій | npm, php artisan, python manage.py |
| Робота з файлами | Пошук, копіювання, архівація | find, cp, tar, rsync |
| Логи | Аналіз журналів системи й застосунків | grep, tail, awk, sed |
| Backup | Резервне копіювання файлів і баз | pg_dump, tar, rsync |
| CI/CD | Команди збірки й тестування | GitHub Actions, GitLab CI |
| ERP-інфраструктура | Обміни, нічні задачі, імпорт/експорт | cron, shell scripts, database dumps |
Встановлення і доступність
На більшості Linux-систем Bash уже встановлений.
Перевірити версію Bash:
bash --version
Дізнатися шлях до Bash:
which bash
Або:
command -v bash
Запустити Bash:
bash
Перша команда
echo "Hello, Bash!"
Команда echo виводить текст у консоль.
Перший Bash-скрипт
Створимо файл hello.sh:
#!/usr/bin/env bash
echo "Hello from Bash script"
Запуск через bash:
bash hello.sh
Або зробити файл виконуваним:
chmod +x hello.sh
./hello.sh
Shebang
Shebang — це перший рядок скрипта, який вказує, якою програмою запускати файл.
Класичний варіант:
#!/bin/bash
Більш переносимий варіант:
#!/usr/bin/env bash
Для сучасних Bash-скриптів часто використовують
#!/usr/bin/env bash, бо він шукає Bash через PATH.
Коментарі
Коментарі починаються з символу #.
# Це коментар
echo "Цей рядок виконається"
Змінні
У Bash змінні створюються без пробілів навколо знака =.
Правильно:
name="Anna"
echo "$name"
Неправильно:
name = "Anna"
У Bash пробіли навколо
=при присвоєнні змінної не ставляться.
Quoting
У Bash дуже важливо правильно використовувати лапки.
| Запис | Значення |
|---|---|
"$var"
|
Підставляє змінну й зберігає пробіли |
'$var'
|
Не підставляє змінну |
$var
|
Підставляє змінну, але може зламатися на пробілах |
Рекомендовано:
filename="my file.txt"
echo "$filename"
Небажано:
echo $filename
У Bash майже завжди краще писати змінні в подвійних лапках:
"$var".
Змінні середовища
Змінні середовища доступні дочірнім процесам.
Показати домашній каталог:
echo "$HOME"
Показати PATH:
echo "$PATH"
Створити змінну середовища:
export APP_ENV=production
Показати всі змінні середовища:
env
PATH
PATH — це список каталогів, у яких Bash шукає виконувані команди.
Приклад:
echo "$PATH"
Якщо команда не запускається, можливо, її немає в PATH.
Аргументи скрипта
Bash-скрипт може приймати аргументи.
| Змінна | Значення |
|---|---|
$0
|
Назва скрипта |
$1
|
Перший аргумент |
$2
|
Другий аргумент |
$@
|
Усі аргументи |
$#
|
Кількість аргументів |
Приклад:
#!/usr/bin/env bash
echo "Script name: $0"
echo "First argument: $1"
echo "Arguments count: $#"
Запуск:
./script.sh hello world
Exit code
Кожна команда повертає код завершення.
| Код | Значення |
|---|---|
| 0 | Успішне виконання |
| не 0 | Помилка або особливий стан |
Перевірити код останньої команди:
echo $?
Приклад:
ls /unknown-folder
echo "Exit code: $?"
Умови if
Приклад умови:
#!/usr/bin/env bash
age=18
if [ "$age" -ge 18 ]; then
echo "Дорослий"
else
echo "Неповнолітній"
fi
Порівняння чисел
| Оператор | Значення |
|---|---|
-eq
|
дорівнює |
-ne
|
не дорівнює |
-gt
|
більше |
-ge
|
більше або дорівнює |
-lt
|
менше |
-le
|
менше або дорівнює |
Приклад:
count=15
if [ "$count" -gt 10 ]; then
echo "Більше ніж 10"
fi
Порівняння рядків
| Вираз | Значення |
|---|---|
"$a" = "$b"
|
рядки рівні |
"$a" != "$b"
|
рядки не рівні |
-z "$a"
|
рядок порожній |
-n "$a"
|
рядок не порожній |
Приклад:
name="Anna"
if [ -n "$name" ]; then
echo "Name is not empty"
fi
Перевірка файлів і каталогів
| Вираз | Значення |
|---|---|
-f file
|
існує звичайний файл |
-d dir
|
існує каталог |
-e path
|
шлях існує |
-r file
|
файл доступний для читання |
-w file
|
файл доступний для запису |
-x file
|
файл виконуваний |
Приклад:
if [ -f "config.yml" ]; then
echo "Config exists"
else
echo "Config not found"
fi
Цикл for
Перебір файлів:
for file in *.txt; do
echo "File: $file"
done
Перебір значень:
for item in apple banana orange; do
echo "$item"
done
Цикл while
count=1
while [ "$count" -le 5 ]; do
echo "$count"
count=$((count + 1))
done
Арифметика
Bash підтримує арифметичні вирази.
a=5
b=7
sum=$((a + b))
echo "$sum"
Інші приклади:
x=$((10 - 3))
y=$((4 * 5))
z=$((20 / 4))
Функції
Функція без аргументів:
say_hello() {
echo "Hello"
}
say_hello
Функція з аргументом:
say_hello() {
echo "Hello, $1"
}
say_hello "Anna"
Функція з кодом повернення:
check_file() {
if [ -f "$1" ]; then
return 0
else
return 1
fi
}
if check_file "config.yml"; then
echo "Config exists"
else
echo "Config missing"
fi
Pipes
Pipe передає результат однієї команди в іншу.
Символ pipe:
|
Приклад:
cat app.log | grep "error"
Порахувати кількість помилок:
grep "error" app.log | wc -l
Знайти процес:
ps aux | grep nginx
Pipes — одна з найсильніших ідей Bash: прості команди можна поєднувати в потужні ланцюжки.
Redirect
Redirect перенаправляє введення або виведення.
| Символ | Значення |
|---|---|
>
|
записати результат у файл, перезаписавши його |
>>
|
додати результат у кінець файлу |
<
|
взяти вхідні дані з файлу |
2>
|
перенаправити помилки |
Приклади:
echo "Hello" > hello.txt
echo "New line" >> hello.txt
ls /unknown 2> errors.log
Логічні оператори
Виконати другу команду тільки якщо перша успішна:
mkdir build && cd build
Виконати другу команду, якщо перша завершилась помилкою:
command || echo "Command failed"
Послідовне виконання:
echo "one"; echo "two"
set -euo pipefail
У Bash-скриптах часто використовують суворіші налаштування.
set -euo pipefail
| Опція | Значення |
|---|---|
set -e
|
завершити скрипт при помилці |
set -u
|
помилка при використанні невизначеної змінної |
set -o pipefail
|
pipe вважається помилковим, якщо помилилась будь-яка команда в ланцюжку |
Приклад:
#!/usr/bin/env bash
set -euo pipefail
echo "Strict mode enabled"
Робота з файлами
Створити файл:
touch notes.txt
Скопіювати файл:
cp notes.txt backup/notes.txt
Перейменувати або перемістити:
mv notes.txt notes_old.txt
Видалити файл:
rm notes_old.txt
Команда
rmвидаляє файли. Перед виконанням треба уважно перевірити шлях.
Робота з каталогами
Створити каталог:
mkdir reports
Створити вкладені каталоги:
mkdir -p logs/2026/may
Видалити каталог із вмістом:
rm -r reports
Команда
rm -rможе видалити цілий каталог разом із файлами.
grep
grep шукає текст.
Пошук у файлі:
grep "error" app.log
Пошук без урахування регістру:
grep -i "error" app.log
Пошук у каталозі:
grep -R "database" .
Показати номери рядків:
grep -n "error" app.log
find
find шукає файли й каталоги.
Знайти файл:
find . -name "config.yml"
Знайти всі log-файли:
find . -name "*.log"
Знайти каталоги:
find . -type d
Знайти файли, змінені за останню добу:
find . -mtime -1
awk
awk використовується для обробки тексту й колонок.
Вивести першу колонку:
awk '{print $1}' access.log
Порахувати суму другої колонки:
awk '{sum += $2} END {print sum}' data.txt
sed
sed використовується для потокового редагування тексту.
Замінити текст:
sed 's/old/new/g' file.txt
Вивести рядки з 10 по 20:
sed -n '10,20p' file.txt
xargs
xargs створює команди з вхідних даних.
Приклад:
find . -name "*.tmp" | xargs rm
Безпечніший варіант для файлів із пробілами:
find . -name "*.tmp" -print0 | xargs -0 rm
tar
Створити архів:
tar -czf backup.tar.gz folder/
Розпакувати архів:
tar -xzf backup.tar.gz
Подивитися вміст:
tar -tzf backup.tar.gz
curl
curl використовується для HTTP-запитів і завантаження файлів.
GET-запит:
curl https://example.com
Завантажити файл:
curl -O https://example.com/file.zip
POST-запит із JSON:
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"Anna"}'
ssh
ssh використовується для підключення до сервера.
ssh user@example.com
Підключення з ключем:
ssh -i key.pem user@example.com
Копіювання файлу через scp:
scp file.txt user@example.com:/home/user/
chmod
chmod змінює права доступу.
Зробити скрипт виконуваним:
chmod +x script.sh
Типові права:
| Значення | Пояснення |
|---|---|
| 755 | власник може все, інші можуть читати й виконувати |
| 644 | власник може читати й писати, інші тільки читати |
| 600 | тільки власник може читати й писати |
Приклад:
chmod 755 script.sh
sudo
sudo запускає команду з правами адміністратора.
sudo apt update
Команда з
sudoможе змінити систему. Її треба виконувати тільки коли зрозуміло, що саме вона робить.
Процеси
Показати процеси:
ps aux
Знайти процес:
ps aux | grep nginx
Завершити процес:
kill 1234
Примусово завершити:
kill -9 1234
Bash і cron
cron використовується для запуску задач за розкладом.
Відкрити crontab:
crontab -e
Запуск скрипта щодня о 02:00:
0 2 * * * /home/user/backup.sh
Формат:
хвилина година день_місяця місяць день_тижня команда
Bash і Git
Типові команди Git у Bash:
git status
git add .
git commit -m "Update"
git push
Клонування:
git clone https://example.com/repo.git
Bash і Docker
Приклади команд Docker:
docker ps
docker build -t app .
docker run app
docker logs container_name
Bash часто використовують у Docker entrypoint-скриптах.
Приклад:
#!/usr/bin/env bash
set -e
echo "Starting application..."
exec "$@"
Bash і CI/CD
Bash часто використовується в CI/CD.
Приклад команд збірки:
npm install
npm test
npm run build
Приклад для PHP:
composer install
vendor/bin/phpunit
Приклад для Python:
pip install -r requirements.txt
pytest
Bash і backup
Приклад backup-скрипта:
#!/usr/bin/env bash
set -euo pipefail
date=$(date +%Y-%m-%d)
backup_dir="/backups/$date"
mkdir -p "$backup_dir"
tar -czf "$backup_dir/files.tar.gz" /var/www
echo "Backup completed: $backup_dir"
Bash і PostgreSQL backup
Приклад резервного копіювання PostgreSQL:
#!/usr/bin/env bash
set -euo pipefail
date=$(date +%Y-%m-%d-%H-%M-%S)
database="erp_database"
backup_dir="/backups/postgres"
mkdir -p "$backup_dir"
pg_dump "$database" > "$backup_dir/$database-$date.sql"
echo "Database backup created"
Bash в ERP-інфраструктурі
Bash може бути корисним для ERP-систем.
Типові задачі:
- backup бази даних;
- імпорт файлів;
- експорт звітів;
- архівування логів;
- запуск нічних обмінів;
- синхронізація каталогів;
- запуск міграцій;
- перевірка сервісів;
- моніторинг дискового простору;
- оновлення застосунку.
Приклад перевірки місця на диску:
df -h
Приклад пошуку великих файлів:
find /var/log -type f -size +100M
Небезпечні команди
| Команда | Чому небезпечна |
|---|---|
rm
|
Видаляє файли |
rm -r
|
Видаляє каталоги з вмістом |
chmod -R
|
Масово змінює права |
chown -R
|
Масово змінює власника |
dd
|
Може перезаписати диск або розділ |
mkfs
|
Форматує файлову систему |
У Bash немає кнопки “скасувати”. Небезпечні команди треба перевіряти до запуску.
Безпечна робота зі скриптами
Небезпечний підхід:
curl https://example.com/install.sh | bashБезпечніше:
curl -O https://example.com/install.sh
less install.sh
bash install.shShellCheck
ShellCheck — інструмент для перевірки Bash/shell-скриптів.
Запуск:
shellcheck script.shShellCheck допомагає знайти:
- помилки quoting;
- невизначені змінні;
- небезпечні конструкції;
- проблеми переносимості;
- типові помилки Bash.
Хороші практики Bash
| Практика | Пояснення |
|---|---|
Використовувати set -euo pipefail
|
Скрипт краще реагує на помилки |
| Брати змінні в лапки | Захист від пробілів і спецсимволів |
| Перевіряти аргументи | Скрипт має пояснювати, що очікує |
| Не хардкодити паролі | Секрети мають бути в environment variables або secret storage |
| Логувати дії | Легше розбирати помилки |
| Використовувати ShellCheck | Автоматична перевірка скриптів |
| Розділяти складну логіку на функції | Скрипт легше читати й підтримувати |
Приклад якісного Bash-скрипта
#!/usr/bin/env bash
set -euo pipefail
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <directory>"
exit 1
fi
directory="$1"
if [ ! -d "$directory" ]; then
echo "Directory does not exist: $directory"
exit 1
fi
echo "Listing files in: $directory"
find "$directory" -type fПереваги Bash
| Перевага | Пояснення |
|---|---|
| Доступність | Bash є майже на кожному Linux-сервері |
| Швидкість автоматизації | Багато задач можна автоматизувати за кілька рядків |
| Інтеграція з Unix-утилітами | grep, find, awk, sed, tar, curl, ssh |
| Потужні pipes | Команди легко поєднувати |
| Добрий для DevOps | Deployment, CI/CD, backup, Docker |
| Простий старт | Перші команди легко вивчити |
| Ідеальний для серверів | Linux-сервери часто адмініструються через Bash |
Недоліки Bash
| Недолік | Пояснення |
|---|---|
| Складність великих скриптів | Bash погано підходить для великих програм |
| Проблеми з quoting | Пробіли й спецсимволи часто створюють помилки |
| Слабка типізація | Усе здебільшого є текстом |
| Небезпечні команди | Помилка може видалити або змінити важливі файли |
| Погана читабельність складної логіки | Для складних задач краще Python, Go або інша мова |
| Різниця між sh і bash | Bash-скрипт може не працювати в sh |
Типові помилки новачків
| Помилка | Чому це проблема |
|---|---|
| Не ставити лапки навколо змінних | Пробіли в іменах файлів можуть зламати скрипт |
Писати name = value
|
У Bash так не оголошуються змінні |
Плутати > і >>
|
> перезаписує файл, >> додає
|
Запускати rm -r без перевірки
|
Можна видалити важливі файли |
Використовувати Bash-синтаксис із #!/bin/sh
|
sh може не підтримувати Bash-можливості |
| Ігнорувати exit code | Скрипт може продовжитись після помилки |
| Зберігати паролі в скрипті | Це небезпечно |
Коли Bash — хороший вибір
| Задача | Чи підходить Bash? |
|---|---|
| Автоматизація команд | Дуже добре |
| Linux server administration | Дуже добре |
| Backup-скрипти | Добре |
| CI/CD steps | Добре |
| Логи й текстові файли | Дуже добре |
| Docker entrypoint | Добре |
| Великий бізнес-застосунок | Не підходить |
| Складна обробка даних | Можливо, але краще Python |
| Web frontend | Не підходить |
Bash у порівнянні з іншими інструментами
| Інструмент | Порівняння з Bash |
|---|---|
| sh | Bash має більше можливостей, але sh більш переносимий |
| Zsh | Zsh зручніший як інтерактивна shell, Bash частіше використовується в скриптах |
| Fish | Fish зручний для користувача, але не сумісний із Bash-синтаксисом |
| PowerShell | PowerShell сильний у Windows і працює з обʼєктами, Bash сильний у Unix/Linux |
| Python | Python краще для складної логіки, Bash краще для склеювання команд |
| Go | Go краще для надійних CLI-утиліт, Bash швидший для простих скриптів |
Рекомендований шлях навчання Bash
| Етап | Що вивчати |
|---|---|
| 1 | Terminal, shell, Bash |
| 2 | pwd, ls, cd |
| 3 | Робота з файлами: cp, mv, rm, mkdir |
| 4 | cat, less, head, tail |
| 5 | grep і find |
| 6 | Pipes і redirect |
| 7 | Змінні й quoting |
| 8 | Аргументи скрипта |
| 9 | if, test, перевірка файлів |
| 10 | for, while |
| 11 | functions |
| 12 | exit codes |
| 13 | set -euo pipefail |
| 14 | ShellCheck |
| 15 | cron, ssh, curl, tar |
| 16 | Docker, Git, CI/CD |
Мінімальний набір для старту
| Компонент | Рекомендація |
|---|---|
| ОС | Linux, macOS або WSL у Windows |
| Shell | Bash |
| Редактор | VS Code, Vim або Nano |
| Перші команди | ls, cd, cat, grep, find |
| Перший скрипт | hello.sh або backup.sh |
| Перевірка | ShellCheck |
| Практика | Логи, backup, Git, Docker, cron |
Простими словами
Bash — це мова команд для Linux/Unix-світу.
Якщо Linux-сервер — це машина, то Bash — це панель керування, через яку розробник або адміністратор запускає, перевіряє, ремонтує й автоматизує роботу системи.
Висновок
Bash — один із найважливіших інструментів у Linux, DevOps і серверній розробці.
Bash потрібен для:
- роботи з Linux;
- серверного адміністрування;
- автоматизації;
- backup;
- CI/CD;
- Docker;
- Git;
- cron;
- аналізу логів;
- деплою;
- ERP-інфраструктури;
- щоденної роботи розробника.
Bash не є найкращим вибором для великих програм зі складною бізнес-логікою, але він незамінний для командного рядка, серверів і автоматизації.
Bash — це не просто оболонка. Це універсальний інструмент, який дозволяє перетворювати ручні дії в повторювані, контрольовані й автоматизовані процеси.
Джерела
- GNU Bash Manual: https://www.gnu.org/software/bash/manual/
- GNU Bash: https://www.gnu.org/software/bash/
- POSIX Shell Command Language: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
- ShellCheck: https://www.shellcheck.net/
- GNU Coreutils Manual: https://www.gnu.org/software/coreutils/manual/
- Linux man-pages: https://www.kernel.org/doc/man-pages/