Как пользоваться Bash: экспресс-руководство для начинающих
Быстрый гайд по самой известной оболочке для Linux: разбираем синтаксис, изучаем команды и запускаем первый скрипт.
Иллюстрация: Оля Ежак для Skillbox Media
Если вы уже пользуетесь Linux, то наверняка ваши запросы к работе с компьютером шире, чем у пользователей Windows или macOS. Bash поможет вам эффективнее использовать Linux, автоматизировать рутинные задачи и в целом работать быстрее, чем позволяет графический интерфейс.
Если вы перешли на Linux недавно, то почитайте наш гайд по командам Bash. Здесь же мы будем разбираться в тонкостях языка и писать скрипт — это чуть более продвинутый уровень.
Содержание
Что такое Bash
Bash (Bourne again shell) — это стандартная командная оболочка в большинстве дистрибутивов Linux и macOS, а также язык для этой оболочки.
Язык Bash поддерживает переменные, массивы, циклы, функции, условные и арифметические операторы, операции ввода-вывода и другие средства. Но главная его фишка — возможность создавать скрипты для ускорения работы на компьютере и автоматизации рутины. Например, с их помощью можно:
- быстро переименовывать все файлы в папке;
- генерировать случайные пароли;
- создавать и отправлять отчёты по электронной почте;
- проверять и обновлять систему и приложения;
- одной командой очищать кэш браузера.
Последний скрипт из этого списка мы и попробуем написать в этой статье. Но для начала рассмотрим продвинутый синтаксис Bash и его основные конструкции: переменные, операторы, циклы и функции.
Основы Bash: синтаксис, переменные и команды
Кодить будем в терминале Linux — он открывается сочетанием клавиш Ctrl + Alt + T. Если вы хотите научиться работать с Bash, но пока не пользуетесь Linux, то пишите код в одном из онлайн-терминалов — например, Replit.
Переменные
Переменные в Bash объявляются просто:
Теперь переменная message хранит значение — текстовое сообщение «Hello, World!». Давайте выведем его — сделать это можно с помощью команды echo:
Обратите внимание на отсутствие пробелов. В Bash пробелы являются разделителями. Если пробелы есть, то Bash будет считать их отдельными токенами и выдавать ошибки.
Следующий код приведёт к ошибке:
Также обратите внимание на символ $ — в Bash он называется символом расширения (expansion character). Поставленный перед именем переменной, он указывает на то, что нужно использовать именно значение переменной, а не одноимённую строку.
Следующий код выведет сообщение «message»:
Чтобы сохранить в переменной введённое пользователем значение, используйте команду read:
Если вы хотите добавить сообщение перед пользовательским вводом, добавьте флаг -p и сообщение после команды read:
В Bash есть несколько правил именования переменных:
- Имя переменной должно начинаться с буквы латинского алфавита (нижнего или верхнего регистра) или символа подчёркивания _.
- Оно может включать буквы, цифры и символ подчёркивания, но не может содержать пробелы или специальные символы.
- Регистр букв в именах переменных имеет значение. Например, переменные var1 и Var1 будут рассматриваться как разные.
- Не рекомендуется использовать зарезервированные слова Bash в качестве имён переменных.
Типы данных
Ну что же, вот мы и создали нашу первую переменную. Поздравляем! Пока эта переменная содержит всего один тип данных — строковый (string). Но в Bash он далеко не единственный — давайте разберём ещё несколько.
Важная оговорка
В Bash нет строгой системы типов, как в некоторых других языках. Тип данных зависит от содержимого переменной и контекста её использования. Поэтому термин «типы данных» в этой статье используется условно, для облегчения понимания. Простите нам это упрощение.
Строки (strings) — это набор символов, заключённый в кавычки. В Bash можно писать строки в одинарных '…' или двойных "…" кавычках. Например, 'Привет' и "Мир" — это строки.
Числа (numbers) — это целочисленные значения. Bash поддерживает арифметические операции с целыми числами, включая сложение, вычитание, умножение и деление. Арифметические выражения нужно предварять знаком $ и обрамлять двойными круглыми скобками:
Также можно использовать команду expr:
Стандартные библиотеки Bash поддерживают следующие арифметические операции:
- Сложение — +.
- Вычитание — -.
- Умножение — *.
- Целочисленное деление — /.
- Остаток от деления — %.
- Возведение в степень — **.
Примечание: арифметические операторы в Bash не работают с числами с плавающей точкой.
Массивы (arrays) — тип переменных, который может хранить несколько значений. Элементы массива перечисляются в круглых скобках через пробел:
При использовании переменной массива в команде применяются фигурные скобки. Если мы хотим вывести его отдельные элементы, это можно сделать с помощью символа $ и номера индекса в квадратных скобках:
А если нам нужно получить сразу все элементы массива, вместо индекса в квадратных скобках нужно поставить символ * или @:
Логические значения (boolean) — нужны для того, чтобы проверить, выполняется ли какое-то условие или нет. Они могут быть либо true (истина), либо false (ложь). Например, в операторах if и while мы пишем условие, и если оно true, то выполняем какое-то действие.
В Bash логические значения представлены целыми числами. Число 0 означает true, а любое другое число означает false. Когда мы выводим логическое значение на экран, то вместо true мы видим 0.
Также в Bash есть операторы сравнения. Например, эти нужны для строк:
- = проверяет, одинаковы ли две строки.
- != проверяет, различаются ли две строки.
А эти — для чисел:
- -eq проверяет, равны ли два числа.
- -ne проверяет, различаются ли два числа.
- -gt проверяет, больше ли первое число, чем второе.
- -lt проверяет, меньше ли первое число, чем второе.
- -ge выводит true, если первое число больше или равно второму.
- -le выводит true, если первое число меньше или равно второму.
Использовать операторы сравнения можно с помощью команды test. Команда test принимает два значения и оператор сравнения и возвращает 1 или 0 в зависимости от результата:
Помимо команды test, операторы сравнения можно использовать квадратных скобках [ ]. Но для этого нам понадобится разобраться, как работать с ветвлениями.
Ветвления
Ветвления if-then-else позволяют проверить условие и выполнить один набор команд, если условие истинно, и другой набор команд, если условие ложно. Это выглядит так:
Обратите внимание: открывающую и закрывающую квадратные скобки нужно отделять от операндов пробелами.
А если в паре с основным условием нужно проверить дополнительное, используют конструкцию elif:
Существует и более короткая форма записи условной конструкции — if-then. Её используют, когда нужно проверить только одно условие:
В этом случае команды будут выполнены, только если условие истинно.
Для наглядности давайте напишем скрипт, который проверяет правильность введённого пароля:
Кроме того, в Bash есть логические операторы & & (логическое И) и || (логическое ИЛИ), которые позволяют комбинировать несколько условий и возвращать соответствующее булево значение.
Например, вот как будет выглядеть наша программа, если мы добавим проверку логина:
Здесь мы получим значение true и сообщение «Password accepted», только если будут выполнены оба условия.
Циклы
Как и в большинстве языков программирования, в Bash есть циклы. Они бывают двух видов:
- for — когда количество итераций заранее известно.
- while — когда количество итераций заранее не известно.
Вот как выглядит сигнатура цикла for:
Количество итераций (часть между in и do) можно указать простым перечислением элементов:
Можно перебрать элементы массива:
Для явного указания нужного количества итераций используют арифметические выражения:
А вот так выглядит сигнатура цикла while:
Условие (condition) — это выражение, результат которого является логическим значением true или false. Команды внутри цикла будут выполняться до тех пор, пока condition возвращает true.
Давайте усовершенствуем нашу программу проверки пароля так, чтобы она запрашивала его до тех пор, пока пользователь не введёт верный:
Что здесь происходит. В этом примере цикл while запрашивает пароль у пользователя, а потом проверяет его на совпадение с правильным с помощью оператора ["$user_input" != "$password"]. А дальше происходит следующее:
- Если пароль неверный, программа выводит соответствующее сообщение, а цикл продолжается.
- Если пароль верный, программа выводит сообщение о принятии пароля и завершает выполнение.
Функции
Функции на языке Bash имеют такой вид:
Например, вот как выглядит простая функция без аргументов:
А вот как выглядит функция, которая принимает аргументы:
Что здесь происходит:
- С помощью ключевого слова local мы создали две локальные переменные — то есть переменные, существующие только внутри функции.
- В одну из них поместили текст, а во вторую — количество повторов.
- Затем создали цикл, который берёт текст из первой переменной и повторяет его столько раз, сколько раз указано во второй.
- Вызвали функцию, передав ей значения hello и 3 — то есть приказали повторить слово «hello» три раза.
Ну здравствуй, Bash! Пишем первый скрипт
Настало время применить знания на практике — напишем скрипт для автоматической очистки кэша браузера и DNS.
Состоять наш скрипт будет из трёх функций: первая — для очистки кэша браузера, вторая — для очистки кэша DNS, а в третью завернём небольшое меню для выбора нужного действия.
Начинаем, как водится, с шебанга — специальной строки, которая говорит компьютеру, с помощью какой программы нужно запускать скрипт. Так как мы хотим использовать bash, которая лежит в папке /bin, шебанг будет выглядеть так:
Теперь напишем функцию, которая будет очищать браузерный кэш. В комментариях — разбор синтаксиса.
Далее напишем функцию для очистки кэша DNS.
Ну а теперь дело за малым. Напишем небольшое меню, чтобы пользователь мог выбрать, кэш браузера или кэш DNS нужно очистить.
Вуаля! Наш скрипт готов. Чтобы его запустить, нам нужно лишь вызвать функцию clear_cache:
В теории можно сделать скрипт и ещё лучше — например, добавить больше браузеров, реализовать проверку прав администратора и другие фишки. Но на сегодня, пожалуй, достаточно.
Что дальше
Вот вы и освоили основные элементы языка Bash и даже написали свой первый скрипт — поздравляем! Если хотите потренироваться в решении задачек на Bash, можете заглянуть в этот онлайн-тренажёр — он бесплатный и довольно гуманный по отношению к новичкам.
Ещё можно посмотреть на проект TryBash, где вся базовая теория дана в виде коротких интерактивных уроков. Там же можно забрать удобную шпаргалку с основными командами Bash, чтобы постоянно не бегать в Google во время обучения и экспериментов.
А если чувствуете, что хотите знать больше, можете почитать Advanced Bash-Scripting Guide («Расширенный гайд по написанию скриптов на Bash») — он на английском, но есть хороший любительский перевод. Ну, или приходите на курс Skillbox «Администрирование ОС Linux» — там тоже много всего полезного :)