
Основы Bash в Linux. Пишем первый скрипт на Bash
Если вы только начинаете осваивать Linux или уже изучили работу с терминалом, то новый этап — научиться создавать сценарии на Bash. Скрипт представляет собой последовательность команд, записанную в файл для последующего запуска одной командой вместо того, чтобы каждый раз вводить их вручную. Это открывает массу возможностей: от простой автоматизации до создания собственных утилит.
В этом руководстве мы разберём, как написать первый работающий Bash-скрипт. Вы узнаете базовый синтаксис языка, научитесь работать с переменными и условиями, а затем создадите практический скрипт, который сможете сразу использовать. Если вы уже работаете с другими языками программирования или инструментами, освоение Bash в Linux займёт минимум времени: синтаксис прост, а практическая польза очевидна с первого скрипта.
Что такое Bash и зачем он нужен
Bash — это консольная оболочка и одновременно язык программирования сценариев для Linux и систем семейства Unix. Её часто путают с терминалом, но терминал — это лишь программа для отображения, а Bash — сам интерпретатор команд.
Bash обрабатывает команды в текстовом виде и служит инструментом для создания автоматизированных сценариев. Почти во всех дистрибутивах Linux именно Bash установлен как оболочка по умолчанию.
Bash работает в двух режимах. В интерактивном режиме вы вводите команды по одной — например, ls для просмотра файлов или cd для перехода между папками — и сразу видите результат. В неинтерактивном режиме Bash выполняет команды из заранее подготовленного файла — скрипта. Вы записываете в этот файл целую последовательность команд и запускаете их одной командой, как программу.
Bash-скрипты избавляют от необходимости каждый день выполнять одни и те же действия вручную. Представьте, что вам регулярно нужно создавать резервную копию важных файлов, очищать логи, переименовывать кучу документов или проверять работу сервера. Вводить это вручную скучно и долго. Скрипт берёт эту рутину на себя. Вот несколько реальных задач, которые легко автоматизировать:
- Массовое переименование или перемещение файлов — например, добавить дату к названиям всех фотографий в папке.
- Автоматическое создание резервных копий — каждый день архивировать каталог с вашими проектами.
- Обработка и фильтрация логов — найти все ошибки за последнюю неделю и сохранить в отдельный файл.
- Настройка системы и установка программ — развернуть рабочее окружение на новом компьютере одной командой.
Первая строка любого Bash-скрипта обычно выглядит как #!/bin/bash. Это называется shebang (или шебанг). Эта строчка говорит операционной системе: «Запускай этот файл именно через Bash, а не через что-то другое». Без неё система может не понять, как выполнять ваш скрипт, или запустит его неправильно.
Что нужно знать о синтаксисе Bash
Прежде чем писать первый скрипт, нужно разобраться с базовым синтаксисом Bash: как работать с переменными, как добавить условия и как повторять действия в цикле. Этих трёх элементов хватит, чтобы создать рабочий скрипт.
Переменные и команды
Переменные в Bash объявляются так: пишете имя переменной, знак равенства и значение — без пробелов. Запись NAME="value" правильная, а NAME = "value" вызовет ошибку.
Добавьте перед именем переменной знак доллара: $NAME. Можно писать и более явно — ${NAME} в фигурных скобках. Второй вариант полезен, когда переменная стоит рядом с другим текстом без пробела.
Теперь о кавычках. В Bash есть два типа — одинарные и двойные, и они работают по-разному. В двойных кавычках переменные раскрываются — система подставляет их значение. А в одинарных кавычках переменная воспринимается как обычный текст. Пример:
NAME="Linux"
echo "Привет, $NAME" # Выведет: Привет, Linux
echo 'Привет, $NAME' # Выведет: Привет, $NAME
Вот что мы получили после запуска нашего скрипта:

Две главные команды для начала — это echo и read. Команда echo выводит текст на экран. Это основной способ показать пользователю результат работы скрипта или промежуточные данные. Команда read делает обратное: получает ввод от пользователя и сохраняет его в переменную.
Ещё один важный элемент — комментарии. Всё, что идёт после символа решётки #, Bash игнорирует. Комментарии нужны, чтобы объяснить, зачем нужна та или иная строка кода.
Простой пример со всем вместе:
#!/bin/bash
# Скрипт приветствия
echo "Как вас зовут?"
read username # Получаем имя от пользователя name="Пользователь"
# Объявляем переменную
echo "Привет, $username!"
После того как Bash запросит наше имя, мы получим следующий результат в консоли:

Условные операторы
С их помощью скрипт может выбирать варианты действий. Основная конструкция имеет вид if-then-else-fi. При истинности условия запускается код, расположенный после then. При ложном результате — код после else. Конструкция всегда завершается словом fi (это if наоборот).
Условие пишется в квадратных скобках, и тут есть важное правило: между скобками и самим условием обязательно должны быть пробелы. Запись [ $a -eq 5 ] правильная, а [$a -eq 5] — нет.
Для сравнения используются специальные операторы. Для чисел это -eq (равно), -ne (не равно), -gt (больше), -lt (меньше), -ge (больше или равно), -le (меньше или равно). Для строк проще: знак равенства = для проверки на равенство и != для неравенства.
Практический пример — проверка существования файла. Это одна из самых частых задач в скриптах:
#!/bin/bash
filename="config.txt"
if [ -f "$filename" ]; then
echo "Файл $filename существует"
else
echo "Файл $filename не найден"
fi
В качестве теста мы не будем создавать запрашиваемый файл, чтобы посмотреть, что выведет консоль. Результат получится следующий:

Оператор -f проверяет, существует ли файл и является ли он обычным файлом (не директорией или чем-то ещё). Обратите внимание: переменная $filename заключена в двойные кавычки — это хорошая практика, которая защищает от ошибок, если в имени файла вдруг окажутся пробелы.
Циклы
Циклы нужны, когда одно и то же действие нужно повторить много раз. В Bash два основных типа циклов: for и while.
Цикл for используется для перебора списков элементов. Например, вы можете обработать все текстовые файлы в папке: for file in *.txt. Или создать последовательность чисел: for i in {1..10}. Первый вариант переберёт все файлы с расширением .txt, второй — числа от 1 до 10.
Вот пример цикла for для обработки файлов:
#!/bin/bash
for file in *.txt
do
echo "Обрабатываю файл: $file"
done
Конструкция while функционирует иначе. Она запускает команды до тех пор, пока сохраняется истинность условия. Это полезно в ситуациях, когда число повторений действия заранее не определено. Например, пока счётчик меньше определённого числа:
#!/bin/bash
count=1
while [ $count -le 5 ]
do
echo "Итерация номер $count"
count=$((count + 1))
done
Вот что мы получим:

Конструкция $((count + 1)) — это арифметическая операция в Bash. Она увеличивает значение переменной count на единицу.
Оба типа циклов заканчиваются словом done. Какой выбрать — зависит от задачи. Если нужно пройтись по известному списку, используйте for. Если нужно повторять действие, пока не выполнится условие, — while.
Как выбрать редактор для написания скриптов
Bash-скрипт — это обычный текстовый файл, так что написать его можно в любом текстовом редакторе. Но некоторые редакторы удобнее других.
Хороший выбор — Nano. Это простейший редактор, который уже установлен в большинстве Linux-систем. Его главное преимущество — не нужно ничего учить. Все основные команды показаны прямо внизу экрана: Ctrl + O для сохранения, Ctrl + X для выхода. Открыли файл, написали код, сохранили — и всё работает.
Кроме того, есть Vim — мощный и быстрый редактор с огромными возможностями. Но у него крутая кривая обучения. Vim работает в модальном режиме: чтобы начать печатать, нужно нажать i, чтобы сохранить и выйти — набрать :wq. Новичка это может сбить с толку. Если вы только начинаете, Vim можно отложить на потом.
Есть ещё один вариант — Visual Studio Code. Это графический редактор с подсветкой синтаксиса и подсказками. Если вы привыкли к визуальным интерфейсам и окнам, а не к терминалу, VS Code будет самым комфортным выбором.
Новичкам лучше всего начинать с редактора VS Code: он понятный, удобный и работает в графическом интерфейсе. Nano тоже подойдёт, если нужно быстро поправить файл прямо в консоли. А вот к Vim стоит возвращаться, когда появится уверенность и желание разобраться в нём глубже.
Пишем первый Bash-скрипт: практика
Теперь применим всё, что изучили, и напишем настоящий работающий скрипт. Создадим утилиту для автоматического создания резервных копий файлов. Это полезная штука, которую можно сразу использовать в реальной работе.
Вот что будет делать наш скрипт: сначала он спросит у пользователя имя файла, который нужно скопировать. Потом проверит, существует ли такой файл. Если файл найден, создаст его копию с добавлением текущей даты и времени в название. Если файла нет, выведет понятное сообщение об ошибке. В конце покажет, где сохранена копия.
Начнём с создания файла. Откройте терминал и выполните команду:
nano backup.sh
Мы используем Nano, но можете взять любой редактор, который вам удобен. Теперь напишем код скрипта. Начнём с обязательного shebang в первой строке:
#!/bin/bash
Эта строка сообщает системе, что файл нужно запускать через Bash. Без неё скрипт может не заработать.
Дальше добавим комментарий, который объясняет назначение скрипта, и запросим у пользователя имя файла:
# Скрипт для создания резервной копии файла с датой
echo "Введите имя файла для резервного копирования:"
read filename
Команда read получает ввод от пользователя и сохраняет его в переменную filename. Теперь нам нужно сохранить текущую дату, чтобы добавить её к имени копии:
current_date=$(date +"%Y-%m-%d_%H-%M-%S")
Конструкция $(date +"%Y-%m-%d_%H-%M-%S") выполняет команду date и сохраняет результат в переменную. Формат даты будет выглядеть примерно так: 2024-03-15_14-30-45.
Теперь самое важное — проверка существования файла и его копирование:
if [ -f "$filename" ]; then
backup_name="${filename}_${current_date}"
cp "$filename" "$backup_name"
echo "Резервная копия создана: $backup_name"
else
echo "Ошибка: файл $filename не найден"
fi
Разберём построчно. Оператор -f проверяет, существует ли файл и является ли он обычным файлом. Переменная backup_name создаёт новое имя: берёт исходное имя файла, добавляет символ подчёркивания и дату. Команда cp копирует исходный файл под новым именем. Дальше скрипт сообщает пользователю, где сохранена копия. Если файл не найден, выводится сообщение об ошибке.
Вот полный код скрипта:
#!/bin/bash
# Скрипт для создания резервной копии файла с датой
echo "Введите имя файла для резервного копирования:"
read filename
current_date=$(date +"%Y-%m-%d_%H-%M-%S")
if [ -f "$filename" ]; then
backup_name="${filename}_${current_date}"
cp "$filename" "$backup_name"
echo "Резервная копия создана: $backup_name"
else
echo "Ошибка: файл $filename не найден"
fi
Как запустить Bash-скрипт в Linux
Скрипт написан, теперь разберёмся, как его запустить. Сначала сохраните файл в редакторе. В Nano нажмите Ctrl + O для сохранения, затем Enter для подтверждения имени и Ctrl + X для выхода. Вы вернётесь в терминал.
По умолчанию Linux не позволяет выполнять только что созданные файлы — это сделано для безопасности. Нужно дать файлу права на выполнение. В терминале выполните:
chmod +x backup.sh
Команда chmod +x делает файл исполняемым. Теперь есть два основных способа запустить скрипт.
Первый и самый распространённый способ — выполнение через ./backup.sh. Точка и слеш перед именем говорят системе: «Запусти файл из текущей директории». Этот способ требует, чтобы файл имел права на выполнение (которые мы только что установили через chmod) и содержал корректный shebang в первой строке.
Второй способ — запуск через bash backup.sh. В этом случае вы явно указываете интерпретатор, и права на выполнение не требуются. Система всё равно запустит файл через Bash.
Давайте протестируем скрипт. Сначала создайте тестовый файл:
echo "Тестовые данные" > test.txt
Теперь запустите скрипт:
./backup.sh
Скрипт спросит имя файла. Введите test.txt и нажмите Enter. Вы увидите сообщение: «Резервная копия создана: test.txt_15.03.2024_14-30-45». Проверьте командой ls — в директории появился новый файл с датой в названии.
Теперь попробуйте ввести имя несуществующего файла, например notfound.txt. Скрипт выведет: «Ошибка: файл notfound.txt не найден». Всё работает правильно.
Что дальше: советы для начинающих
Чтобы ваши скрипты были надёжными и удобными в поддержке, стоит придерживаться нескольких базовых практик:
-
Всегда используйте shebang. Строка
#!/bin/bashв начале файла обеспечивает правильное выполнение скрипта в любой системе, независимо от настроек окружения пользователя. -
Добавляйте комментарии к коду. Особенно для сложной логики и нетривиальных решений. Даже собственный код через месяц может показаться непонятным без пояснений.
-
Выбирайте понятные имена переменных. Вместо абстрактных a или x используйте описательные названия вроде
filenameилиbackup_date— это упрощает чтение и отладку. -
Заключайте переменные в двойные кавычки. Запись
"$var"вместо$varзащищает от проблем с пробелами и специальными символами в значениях. -
Проверяйте входные данные. Убедитесь, что пользователь ввёл корректное значение, файл существует, а число действительно является числом, прежде чем обрабатывать данные.
-
Тестируйте на копиях. Никогда не запускайте непроверенные скрипты на важных данных. Создайте тестовую директорию с копиями файлов: восстановить удалённый по ошибке документ может быть сложно или невозможно.
-
Используйте режим отладки. Команда
bash -x script.shпоказывает, какие команды выполняются и с какими значениями, — это экономит массу времени при поиске ошибок. -
Проверяйте код через ShellCheck. Этот автоматический анализатор находит типичные ошибки в Bash-скриптах и предлагает улучшения ещё до запуска.
Эффективнее всего начинать с простых скриптов и постепенно усложнять их, добавляя новые функции по мере роста опыта. Официальная документация Bash (доступна через команду man bash), решения на Stack Overflow и практика на реальных задачах из повседневной работы помогут быстро прокачать навыки скриптинга.