Заставляем пингвина делать всё, что нам нужно.
Linux — операционная система с открытым исходным кодом, которая даёт пользователям больше гибкости и контроля над системой. С помощью Bash — встроенного языка командной строки — можно автоматизировать рутинные задачи и управлять системой с помощью скриптов. В этой статье разберём, что такое Bash, зачем он нужен и как с его помощью писать полезные скрипты.
Что такое Bash
Кроме того, Bash — это и язык программирования, который позволяет создавать скрипты для автоматизации задач. Bash-скрипты поддерживают переменные, циклы, условия, функции и могут взаимодействовать с файловой системой и вводом-выводом.
Bash чаще всего используют для автоматизации — например, чтобы:
- переименовать сотни файлов в папке;
- раз в сутки копировать важные документы в резервную папку;
- настроить запуск сервера или программы при включении компьютера;
- скачать нужный архив и сразу его распаковать.
Хотя Bash чаще всего ассоциируют с Linux, он также работает на macOS, а в Windows его можно использовать через WSL (Windows Subsystem for Linux).
Как выбрать редактор для работы
Прежде чем погрузиться в основы Bash, нужно выбрать редактор и подготовить рабочее окружение. Для написания скриптов подойдёт любой текстовый редактор, встроенный в операционную систему, однако гораздо удобнее работать в специально настроенной среде. Ниже — три популярных варианта: от классических консольных редакторов до современной графической IDE.
Vim: нестареющая классика
Интерфейс редактора Vim в терминале
Скриншот: Vim / Skillbox Media
- Есть подсветка синтаксиса и автодополнение кода.
- С помощью плагинов можно превратить Vim в полноценную консольную IDE.
- Большие возможности кастомизации.
- Новичкам бывает трудно научиться работать с редактором.
- Нужно выделить время на настройку.
Nano: минимализм и простота
Интерфейс редактора Nano в терминале
Скриншот: Nano / Skillbox Media
- Простой в освоении, что полезно для новичков.
- Интуитивно понятный интерфейс.
- Нет поддержки плагинов, автоматического завершения кода.
- Мало возможностей для кастомизации.
VS Code: золотой стандарт
Графический интерфейс редактора VS Code с открытой страницей дополнения Bash IDE
Скриншот: Visual Studio Code / Skillbox Media
- Подходит для программирования на любом языке.
- Есть подсветка синтаксиса, автоматическое завершение кода, плагины для кастомизации и даже ИИ-помощники.
- Современный пользовательский интерфейс.
- Может сильно нагружать систему, если установить много плагинов.
- Долго запускается на слабых компьютерах.
Пока можете выбрать редактор, который вам больше понравился по описанию. Позже, безусловно, у вас будет время попробовать несколько решений и определить фаворита. Мы в этой статье будем показывать всё на примере редактора Nano.
Как создать скрипт
touch имя_файла.sh
Если не указать точный путь к файлу, то команда touch создаст его в домашней папке Linux.
Файл script.sh в домашней папке — результат работы команды touch
Скриншот: 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 с открытым скриптом
Скриншот: Nano / Skillbox Media
Сохраняем скрипт
Перед тем как закрывать редактор, надо сохранить скрипт. В современных редакторах, например, в VS Code, можно настроить функцию автосохранения. В Vim, Nano и других консольных программах всё надо делать вручную.
В Nano для сохранения файла используйте сочетание клавиш Ctrl + O, а для выхода из программы — Ctrl + X.
Как запустить Bash-скрипт в Linux
В Linux есть встроенная защита, которая не даёт случайным скриптам запускаться и хозяйничать в компьютере. Пользователь должен явно указать, что файл может быть исполняемым. Для этого в терминале надо выполнить следующую команду:
chmod +x script.sh
После этого скрипт можно запустить с помощью команды ./:
./script.sh
Программа, которую мы написали ранее, просто выведет в терминал приветствие «Hello, World!»:
Скриншот: Bash / Skillbox Media
Аргументы
./имя_скрипта.sh аргумент1 аргумент2 аргумент3…
Давайте разберёмся на примере. Представьте, что вы написали код, который выводит в терминал приветствие для Михаила:
#!/bin/bash echo “Привет, Михаил!”
При каждом запуске скрипт будет выводить один и тот же текст, но с помощью аргументов можно сделать так, чтобы код выводил имя, которое пользователь указывает в терминале:
#!/bin/bash echo “Привет, $1!”
Команда для запуска скрипта будет выглядеть так:
./script.sh Екатерина
В терминале появится приветствие с именем, которое указали во время запуска:
Скриншот: Bash / Skillbox Media
В коде можно использовать несколько тысяч аргументов. Их количество ограничено только длиной командной строки в каждой системе. Давайте напишем скрипт, который будет принимать фамилию, имя, возраст пользователя и выводить их в терминал:
#!/bin/bash echo “Имя: $1” echo “Фамилия: $2” echo “Возраст: $3”
Запустим код с помощью команды ./script.sh Екатерина Иванова 31 и посмотрим на вывод в терминале:
Скриншот: Bash / Skillbox Media
Переменные
Чтобы объявить переменную, нужно указать её название, а после поставить знак равенства и вписать значение:
name=”Иван”
Чтобы обратиться к переменной, нужно вписать её название после символа доллара ($):
$name
Давайте создадим скрипт, в котором будет одна переменная с заранее известным значением — переменная с именем Иван, а возраст пользователь должен будет передать в виде аргумента:
#!/bin/bash name=”Иван” echo “Здравствуйте, $name!” echo “Ваш возраст: $1”
Вот что выведет скрипт:
Скриншот: Bash / Skillbox Media
Значения переменных можно использовать в математических операциях. Для этого в Bash используют конструкцию $(()). Напишем скрипт, который складывает значения двух переменных:
#!/bin/bash variable1=86 variable2=91 total=$((points1 + points2)) echo “Сумма: $total”
Вот что код выведет в терминал:
Скриншот: Bash / Skillbox Media
Значения переменных можно не только складывать. Вот список математических операторов, доступных в Bash:
Операция | Оператор |
---|---|
Сложение | + |
Вычитание | – |
Умножение | * |
Целочисленное деление | / |
Остаток от деления | % |
Возведение в степень | ** |
Условные операторы
Вот как она выглядит в общем виде:
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 / Skillbox Media
Циклы
Циклы — конструкции, которые позволяют выполнять одну и ту же последовательность команд несколько раз. Например, с их помощью можно последовательно обработать несколько файлов или вывести в терминал заданную последовательность чисел. В 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
Скриншот: Bash / Skillbox Media
Ещё цикл 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
Вот что появится в терминале после запуска скрипта:
Скриншот: Bash / Skillbox Media
Цикл until
Цикл until — противоположность while: он выполняет команды, пока условие остаётся ложным. Цикл завершится, когда условие станет истинным. Теперь выведем числа в обратном порядке. Для этого создадим переменную со значением 10 и на каждом шаге будем вычитать из него 1. Будем продолжать до тех пор, пока значение переменной не станет единицей, — это остановит выполнение кода:
#!/bin/bash number=10 until [ $number -lt 1 ]; do echo “Обратный отсчёт: $number” number=$((number – 1)) done
Результат работы кода:
Скриншот: Bash / Skillbox Media
Конструкция Case
В общем виде конструкция 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 / Skillbox Media
Функции
Функции в Bash — небольшие фрагменты кода, который можно написать один раз и повторно использовать в разных местах скрипта. Например, если в коде вам надо часто вычислять среднее значение нескольких чисел, то этот алгоритм можно оформить в виде функции.
В общем виде функции в Bash выглядят так:
имя_функции () { тело_функции }
В ней:
- имя_функции — идентификатор, с помощью которого функцию можно будет вызвать в любом месте кода.
- тело_функции — команды, которые функция выполняет.
В Bash есть два способа вывести результат работы функции:
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 / Skillbox Media
Главное
- Bash — командная оболочка Linux и одноимённый язык программирования.
- С помощью Bash можно разрабатывать скрипты для автоматизации рутинных задач. Например, можно создать скрипт, который будет автоматически переименовывать файлы по шаблону.
- Bash поддерживает работу с переменными, функциями, циклами, математическими вычислениями, файловой системой компьютера и операциями ввода-вывода.
- Скрипты на Bash можно писать в любом текстовом редакторе, но удобнее делать это в специальных средах — например, в Vim, Nano или VS Code.