Введение / Зачем это нужно
Shell-скрипты позволяют автоматизировать рутину в Linux: резервное копирование, обслуживание логов, развёртывание и проверку систем. Вместо того чтобы вводить одни и те же команды каждый день, вы создаёте скрипт один раз и запускаете его за секунды. Это экономит время и снижает риск ошибок от опечаток.
После прочтения вы сможете создавать и запускать базовые скрипты, использовать переменные, условия и циклы, а также проверять результат и исправлять типовые ошибки.
Требования / Подготовка
- Bash 4.4+ (входит в большинство современных дистрибутивов).
- Любой текстовый редактор: nano, vim или VS Code.
- Права на запись в рабочий каталог и выполнение файлов.
- Базовое понимание командной строки:
cd,ls,chmod.
Шаг 1: Создать файл скрипта и добавить shebang
Создайте файл с понятным именем, например hello.sh, и добавьте первой строкой shebang — это указывает, в каком shell выполнять скрипт:
#!/bin/bash
Сделайте файл исполняемым:
chmod +x hello.sh
💡 Совет: Если скрипт должен работать на разных системах, проверьте путь к bash через
which bash. Для максимальной переносимости можно использовать#!/usr/bin/env bash.
Шаг 2: Добавить комментарии и переменные
Опишите цель скрипта и задайте переменные. Всегда заключайте строки с пробелами в двойные кавычки:
#!/bin/bash
# hello.sh — приветствие и информация о системе
user="Иван"
greeting="Добро пожаловать, $user"
echo "$greeting"
echo "Сегодня: $(date)"
Используйте $(command) для подстановки вывода команды в переменную или строку.
Шаг 3: Реализовать условия и циклы
Добавьте логику с помощью if и циклы для повторяющихся задач. Пример проверки существования файла:
file="/tmp/test.log"
if [[ -f "$file" ]]; then
echo "Файл $file существует."
else
echo "Файл $file не найден — создаю."
touch "$file"
fi
Пример цикла for для обработки списка:
for name in Алиса Борис Виктор; do
echo "Привет, $name"
done
И цикл while для чтения файла построчно:
while IFS= read -r line; do
echo "Строка: $line"
done < "$file"
Шаг 4: Принимать аргументы и проверять коды возврата
Скрипт может получать параметры при запуске. Проверяйте их количество и используйте exit для завершения с кодом:
#!/bin/bash
# usage: ./greet.sh <имя>
if [[ $# -lt 1 ]]; then
echo "Ошибка: укажите имя."
exit 1
fi
name="$1"
echo "Здравствуйте, $name"
Проверяйте успешность команд через $? или прямо в условии:
if cp source.txt backup.txt; then
echo "Копирование успешно."
else
echo "Копирование не удалось." >&2
exit 2
fi
Шаг 5: Протестировать и отладить
Запустите скрипт в режиме отладки, чтобы видеть каждую выполненную команду:
bash -x hello.sh
Или добавьте временно в скрипт:
set -x # включить отладку
# ваши команды
set +x # отключить отладку
Проверьте:
- Правильность путей и прав на файлы.
- Корректность shebang.
- Отсутствие скрытых символов (особенно при переносе из Windows).
Проверка результата
После правок запустите скрипт:
./hello.sh
Ожидаемый вывод должен содержать приветствие, текущую дату и результаты действий, прописанных в логике. Если поведение отличается, используйте bash -x и проверьте коды возврата команд.
Возможные проблемы
- Permission denied — у файла нет прав на выполнение. Выполните
chmod +x script.sh. - No such file or directory при запуске — проверьте shebang и наличие переносов строк (CRLF). Исправьте через
dos2unix script.sh. - Скрипт выполняется в другом shell — без shebang запуск может пойти через текущий shell, что приведёт к ошибкам синтаксиса. Всегда указывайте
#!/bin/bashили#!/usr/bin/env bash. - Переменные пустые или с пробелами — заключайте их в двойные кавычки внутри условий и команд:
"$var". - Неожиданное завершение на ошибке — добавьте
set -eв начало, чтобы скрипт прерывался при первой неудачной команде, или обрабатывайте коды возврата явно.