Что такое Linux Bash и как им пользоваться
Заставляем пингвина делать всё, что нам нужно.


Иллюстрация: Катя Павловская для Skillbox Media
Linux — операционная система с открытым исходным кодом, которая даёт пользователям больше гибкости и контроля над системой. С помощью Bash — встроенного языка командной строки — можно автоматизировать рутинные задачи и управлять системой благодаря скриптам. В этой статье разберём, что такое Bash, зачем он нужен и как с его помощью писать полезные скрипты.
Содержание
- Что такое Bash
- Какой редактор выбрать
- Как создать скрипт
- «Привет, мир!»: пишем первый скрипт
- Как запустить Bash-скрипт в Linux
- Аргументы
- Переменные
- Условные операторы
- Циклы
- Конструкция case
- Функции
Что такое Bash
Bash (Bourne Again Shell) — это одна из самых популярных оболочек командной строки в Linux. Она позволяет взаимодействовать с системой с помощью простых текстовых команд.
Кроме того, Bash — это и язык программирования, который позволяет создавать скрипты для автоматизации задач. Bash-скрипты поддерживают переменные, циклы, условия, функции и могут взаимодействовать с файловой системой и вводом-выводом.
Bash чаще всего используют для автоматизации — например, чтобы:
- переименовать сотни файлов в папке;
- раз в сутки копировать важные документы в резервную папку;
- настроить запуск сервера или программы при включении компьютера;
- скачать нужный архив и сразу его распаковать.
Хотя Bash чаще всего ассоциируют с Linux, он также работает на macOS, а в Windows его можно использовать через WSL (Windows Subsystem for Linux).
Как выбрать редактор для работы
Прежде чем погрузиться в основы Bash, нужно выбрать редактор и подготовить рабочее окружение. Для написания скриптов подойдёт любой текстовый редактор, встроенный в операционную систему, однако гораздо удобнее работать в специально настроенной среде. Ниже — три популярных варианта: от классических консольных редакторов до современной графической IDE.
Vim: нестареющая классика

Скриншот: Vim / Skillbox Media
Vim — это консольный редактор, который профессионалы часто используют для работы с Bash-скриптами. Его ценят за высокую скорость работы и универсальность.
Преимущества:
- Есть подсветка синтаксиса и автодополнение кода.
- С помощью плагинов можно превратить Vim в полноценную консольную IDE.
- Большие возможности кастомизации.
Недостатки:
- Новичкам бывает трудно научиться работать с редактором.
- Нужно выделить время на настройку.
Nano: минимализм и простота

Скриншот: Nano / Skillbox Media
Nano — ещё один консольный редактор, но уже для тех, кто хочет сразу перейти к работе и не тратить время на настройку. Разработчики дистрибутивов Linux включают Nano в базовый набор программ, который доступен из коробки.
Преимущества:
- Простой в освоении, что полезно для новичков.
- Интуитивно понятный интерфейс.
Недостатки:
- Нет поддержки плагинов, автоматического завершения кода.
- Мало возможностей для кастомизации.
VS Code: золотой стандарт

Скриншот: Visual Studio Code / Skillbox Media
VS Code — универсальный редактор кода, который можно превратить в среду разработки на практически любом языке программирования. Чтобы работать с Bash было удобно, стоит установить плагин Bash IDE.
Преимущества:
- Подходит для программирования на любом языке.
- Есть подсветка синтаксиса, автоматическое завершение кода, плагины для кастомизации и даже ИИ-помощники.
- Современный пользовательский интерфейс.
Недостатки:
- Может сильно нагружать систему, если установить много плагинов.
- Долго запускается на слабых компьютерах.
Пока можете выбрать редактор, который вам больше понравился по описанию. Позже, безусловно, у вас будет время попробовать несколько решений и определить фаворита. Мы в этой статье будем показывать всё на примере редактора Nano.
Как создать скрипт
Bash-скрипт — это текстовый файл с расширением .sh, который содержит в себе набор команд для оболочки Bash. Чтобы создать такой файл в Linux, надо запустить терминал и выполнить в нём команду touch. В качестве аргумента следует указать имя нового файла:
touch имя_файла.sh
Если не указать точный путь к файлу, то команда touch создаст его в домашней папке Linux.

Скриншот: Linux Ubuntu / Skillbox Media
Созданный файл можно открыть в любом текстовом редакторе. Это можно сделать двойным кликом левой кнопки мыши или с помощью терминала. При втором способе надо выполнить команду, которая состоит из названия редактора и имени файла. Например, вот так можно открыть файл с помощью Nano:
nano script.sh
«Привет, мир!»: пишем первый скрипт
По традиции программисты начинают изучать новый язык программирования с помощью программы, которая выводит на экран фразу «Hello, World!». Не будем ломать устои и пойдём по уже протоптанному пути :)
Создайте файл с расширением .sh, откройте его в текстовом редакторе и вставьте в него код нашего первого скрипта:
#!/bin/bash
echo "Hello, World!"
В коде выше:
- #!/bin/bash — строка, которая указывает, какая программа должна выполнить команды в файле. Например, если бы мы указали #!/bin/python3, то система ожидала бы от нас кода на Python. В сообществе эту строку называют «шебанг».
- echo"Hello, World!" — команда, которая выводит фразу после себя в терминал.
В интерфейсе редактора Nano код выглядит так:

Скриншот: Nano / Skillbox Media
Сохраняем скрипт
Перед тем как закрывать редактор, надо сохранить скрипт. В современных редакторах, например в VS Code, можно настроить функцию автосохранения. В Vim, Nano и других консольных программах всё надо делать вручную.
В Nano для сохранения файла используйте сочетание клавиш Ctrl + O, а для выхода из программы — Ctrl + X.
Как запустить Bash-скрипт в Linux
В Linux есть встроенная защита, которая не даёт случайным скриптам запускаться и хозяйничать в компьютере. Пользователь должен явно указать, что файл может быть исполняемым. Для этого в терминале надо выполнить следующую команду:
chmod +x script.sh
После этого скрипт можно запустить с помощью команды ./:
./script.sh
Программа, которую мы написали ранее, просто выведет в терминал приветствие «Hello, World!»:

Аргументы
Аргументы — это данные, которые можно передать скрипту во время запуска. Они позволяют менять поведение скрипта без изменения кода. Вот так в общем виде выглядит запуск скрипта с несколькими аргументами:
./имя_скрипта.sh аргумент1 аргумент2 аргумент3...
Давайте разберёмся на примере. Представьте, что вы написали код, который выводит в терминал приветствие для Михаила:
#!/bin/bash
echo "Привет, Михаил!"
При каждом запуске скрипт будет выводить один и тот же текст, но с помощью аргументов можно сделать так, чтобы код выводил имя, которое пользователь указывает в терминале:
#!/bin/bash
echo "Привет, $1!"
Команда для запуска скрипта будет выглядеть так:
./script.sh Екатерина
В терминале появится приветствие с именем, которое указали во время запуска:

В коде можно использовать несколько тысяч аргументов. Их количество ограничено только длиной командной строки в каждой системе. Давайте напишем скрипт, который будет принимать фамилию, имя, возраст пользователя и выводить их в терминал:
#!/bin/bash
echo "Имя: $1"
echo "Фамилия: $2"
echo "Возраст: $3"
Запустим код с помощью команды ./script.sh Екатерина Иванова 31 и посмотрим на вывод в терминале:

Переменные
Переменные — это контейнеры для хранения данных. Вместо того чтобы вручную указывать повторяющееся значение в разных местах скрипта, можно обращаться к переменной, в которой хранится это значение.
Чтобы объявить переменную, нужно указать её название, а после поставить знак равенства и вписать значение:
name="Иван"
Чтобы обратиться к переменной, нужно вписать её название после символа доллара ($):
$name
Давайте создадим скрипт, в котором будет одна переменная с заранее известным значением — переменная с именем Иван, а возраст пользователь должен будет передать в виде аргумента:
#!/bin/bash
name="Иван"
echo "Здравствуйте, $name!"
echo "Ваш возраст: $1"
Вот что выведет скрипт:

Значения переменных можно использовать в математических операциях. Для этого в Bash используют конструкцию $(( )). Напишем скрипт, который складывает значения двух переменных:
#!/bin/bash
variable1=86
variable2=91
total=$((points1 + points2))
echo "Сумма: $total"
Вот что код выведет в терминал:

Значения переменных можно не только складывать. Вот список математических операторов, доступных в Bash:
Операция | Оператор |
---|---|
Сложение | + |
Вычитание | - |
Умножение | * |
Целочисленное деление | / |
Остаток от деления | % |
Возведение в степень | ** |
Условные операторы
Условные операторы — это конструкции, которые позволяют выполнять команды в зависимости от выполнения условий. Их используют вместе с условной конструкцией if-then.
Вот как она выглядит в общем виде:
if [ условие ]; then
команды, которые нужно выполнить, если условие верно
else
команды по умолчанию
fi
Операторы, которые можно использовать в условиях, выглядят так:
Сравнения чисел | |
---|---|
Операция | Оператор |
Равно | -eq |
Не равно | -ne |
Меньше | -lt |
Больше | -gt |
Меньше или равно | -le |
Больше или равно | -ge |
Сравнения строк | |
---|---|
Операция | Оператор |
Равно | = |
Не равно | != |
Меньше | < |
Больше | > |
Строка пустая | -z |
Строка не пустая | -n |
Проверка файлов | |
---|---|
Операция | Оператор |
Файл существует | -e |
Обычный файл | -f |
Исполняемый файл | -x |
Директория | -d |
Файл доступен для чтения | -r |
Файл доступен для записи | -w |
Логические операции | |
---|---|
Операция | Оператор |
Логическое И | && |
Логическое ИЛИ | || |
Напишем программу, которая в виде аргумента будет получать количество баллов пользователя и сообщать, сдал он экзамен или нет. Договоримся, что для успешной сдачи экзамена надо набрать не менее 85 баллов:
#!/bin/bash
minimum_score=85
user_score=$1
if [ $user_score -gt $minimum_score ]; then
echo "Вы сдали экзамен!"
else
echo "Вы не сдали экзамен."
fi
Вот что программа выведет, если запустить её с разными аргументами:

Циклы
Циклы — конструкции, которые позволяют выполнять одну и ту же последовательность команд несколько раз. Например, с их помощью можно последовательно обработать несколько файлов или вывести в терминал заданную последовательность чисел. В Bash есть три вида циклов: for, while и until. Давайте детально рассмотрим каждый.
Цикл for
Цикл for выполняет команду для каждого значения из списка. Для примера напечатаем с его помощью числа от 1 до 10:
#!/bin/bash
for number in 1 2 3 4 5 6 7 8 9 10; do
echo "Число: $number"
done

Ещё цикл for можно использовать для обхода файлов в директории. Скрипт откроет каждый файл, соответствующий указанным параметрам, и выполнит заданное действие:
#!/bin/bash
for file in *.txt; do
echo "Файл: $file"
done
Цикл while
Цикл while выполняет команды, пока условие истинно. Как только условие становится ложным, выполнение цикла прекращается. В качестве примера снова напишем скрипт для вывода чисел от 1 до 10. На этот раз слегка изменим алгоритм: создадим переменную, значение которой будем увеличивать на каждом шаге до тех пор, пока оно не станет равно 10. Это и остановит выполнение кода:
#!/bin/bash
number=1
while [ $number -le 10 ]; do
echo "Число: $number"
number=$((number + 1))
done
Вот что появится в терминале после запуска скрипта:

Цикл until
Цикл until — противоположность while: он выполняет команды, пока условие остаётся ложным. Цикл завершится, когда условие станет истинным. Теперь выведем числа в обратном порядке. Для этого создадим переменную со значением 10 и на каждом шаге будем вычитать из него 1. Будем продолжать до тех пор, пока значение переменной не станет единицей, — это остановит выполнение кода:
#!/bin/bash
number=10
until [ $number -lt 1 ]; do
echo "Обратный отсчёт: $number"
number=$((number - 1))
done
Результат работы кода:

Конструкция Case
Case — конструкция Bash для обработки множественных условий. В других языках программирования эта конструкция называется switch. Её используют, например, чтобы сравнить переменные с несколькими шаблонами.
В общем виде конструкция case в Bash выглядит так:
case variable in
pattern1)
command1
;;
pattern2)
command2
;;
pattern3)
command3
;;
*)
command_default
;;
esac
В ней:
- variable — переменная, которую нужно проверить.
- pattern1, pattern2, pattern3 — возможные значения, среди которых скрипт будет искать истинное.
- command1, command2, command3 — команды, которые выполнятся, если значение переменной совпадёт с соответствующим шаблоном.
- *) — шаблон по умолчанию, содержимое которого выполнится в любом случае.
- command_default — команды по умолчанию.
- esac — ключевое слово, которое указывает на завершение конструкции case: esac — буквально case наоборот.
Напишем скрипт, который при запуске выводит в терминал текущий день недели. Для этого используем case, а переменной date присвоим значение date +%u. Эта команда обращается к утилите date — встроенному инструменту Linux, который отслеживает дату и время, и возвращает числовое значение дня недели (1 — понедельник, 2 — вторник и так далее).
Вот как выглядит код этого скрипта:
#!/bin/bash
day=$(date +%u)
case $day in
1)
echo "Сегодня понедельник"
;;
2)
echo "Сегодня вторник"
;;
3)
echo "Сегодня среда"
;;
4)
echo "Сегодня четверг"
;;
5)
echo "Сегодня пятница"
;;
6)
echo "Сегодня суббота"
;;
*)
echo "Неверное значение"
;;
esac
А вот что он выводит в терминал:

Функции
Функции в Bash — небольшие фрагменты кода, который можно написать один раз и повторно использовать в разных местах скрипта. Например, если в коде вам надо часто вычислять среднее значение нескольких чисел, то этот алгоритм можно оформить в виде функции.
В общем виде функции в Bash выглядят так:
имя_функции () {
тело_функции
}
В ней:
- имя_функции — идентификатор, с помощью которого функцию можно будет вызвать в любом месте кода.
- тело_функции — команды, которые функция выполняет.
В Bash есть два способа вывести результат работы функции:
С помощью return. Ключевое слово return возвращает только целые числа от 0 до 255. Этот способ чаще всего используют для вывода кода ошибок или служебных флагов — чисел, которые подсказывают программе, что следует делать дальше.
check_even() {
if (( $1 % 2 == 0 )); then
return 0
else
return 1
fi
}
С помощью echo. Если надо вывести строку или число, которое не входит в промежуток 0–255, лучше всего использовать ключевое слово echo.
check_even() {
if (( $1 % 2 == 0 )); then
return 0 # Чётное
else
return 1 # Нечётное
fi
}
Давайте напишем функцию, которая ищет в папке файлы по названию, переданному пользователем в качестве аргумента.
Код скрипта:
#!/bin/bash
# Функция для поиска файла по имени
check_file() {
if [ -e "$1" ]; then
echo "Файл '$1' существует."
else
echo "Файл '$1' не найден."
fi
}
check_file "file.txt" # Вызываем функцию и передаём ей имя файла
Что скрипт выведет в терминал:

Главное
- Bash — командная оболочка Linux и одноимённый язык программирования.
- С помощью Bash можно разрабатывать скрипты для автоматизации рутинных задач. Например, можно создать скрипт, который будет автоматически переименовывать файлы по шаблону.
- Bash поддерживает работу с переменными, функциями, циклами, математическими вычислениями, файловой системой компьютера и операциями ввода-вывода.
- Скрипты на Bash можно писать в любом текстовом редакторе, но удобнее делать это в специальных средах — например, в Vim, Nano или VS Code.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!