Скидки до 60% и розыгрыш MacBook 0 дней 00 :00 :00 Выбрать курс
Код
#статьи

Что такое Linux Bash и как им пользоваться

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

Иллюстрация: Катя Павловская для Skillbox Media

Linux — операционная система с открытым исходным кодом, которая даёт пользователям больше гибкости и контроля над системой. С помощью Bash — встроенного языка командной строки — можно автоматизировать рутинные задачи и управлять системой благодаря скриптам. В этой статье разберём, что такое Bash, зачем он нужен и как с его помощью писать полезные скрипты.

Содержание


Что такое Bash

Bash (Bourne Again Shell) — это одна из самых популярных оболочек командной строки в Linux. Она позволяет взаимодействовать с системой с помощью простых текстовых команд.

Кроме того, Bash — это и язык программирования, который позволяет создавать скрипты для автоматизации задач. Bash-скрипты поддерживают переменные, циклы, условия, функции и могут взаимодействовать с файловой системой и вводом-выводом.

Bash чаще всего используют для автоматизации — например, чтобы:

  • переименовать сотни файлов в папке;
  • раз в сутки копировать важные документы в резервную папку;
  • настроить запуск сервера или программы при включении компьютера;
  • скачать нужный архив и сразу его распаковать.

Хотя Bash чаще всего ассоциируют с Linux, он также работает на macOS, а в Windows его можно использовать через WSL (Windows Subsystem for Linux).

Как выбрать редактор для работы

Прежде чем погрузиться в основы Bash, нужно выбрать редактор и подготовить рабочее окружение. Для написания скриптов подойдёт любой текстовый редактор, встроенный в операционную систему, однако гораздо удобнее работать в специально настроенной среде. Ниже — три популярных варианта: от классических консольных редакторов до современной графической IDE.


Vim: нестареющая классика

Интерфейс редактора Vim в терминале
Скриншот: Vim / Skillbox Media

Vim — это консольный редактор, который профессионалы часто используют для работы с Bash-скриптами. Его ценят за высокую скорость работы и универсальность.

Преимущества:

  • Есть подсветка синтаксиса и автодополнение кода.
  • С помощью плагинов можно превратить Vim в полноценную консольную IDE.
  • Большие возможности кастомизации.

Недостатки:

  • Новичкам бывает трудно научиться работать с редактором.
  • Нужно выделить время на настройку.

Nano: минимализм и простота

Интерфейс редактора Nano в терминале
Скриншот: Nano / Skillbox Media

Nano — ещё один консольный редактор, но уже для тех, кто хочет сразу перейти к работе и не тратить время на настройку. Разработчики дистрибутивов Linux включают Nano в базовый набор программ, который доступен из коробки.

Преимущества:

  • Простой в освоении, что полезно для новичков.
  • Интуитивно понятный интерфейс.

Недостатки:

  • Нет поддержки плагинов, автоматического завершения кода.
  • Мало возможностей для кастомизации.

VS Code: золотой стандарт

Графический интерфейс редактора VS Code с открытой страницей дополнения Bash IDE
Скриншот: Visual Studio Code / Skillbox Media

VS Code — универсальный редактор кода, который можно превратить в среду разработки на практически любом языке программирования. Чтобы работать с Bash было удобно, стоит установить плагин Bash IDE.

Преимущества:

  • Подходит для программирования на любом языке.
  • Есть подсветка синтаксиса, автоматическое завершение кода, плагины для кастомизации и даже ИИ-помощники.
  • Современный пользовательский интерфейс.

Недостатки:

  • Может сильно нагружать систему, если установить много плагинов.
  • Долго запускается на слабых компьютерах.

Пока можете выбрать редактор, который вам больше понравился по описанию. Позже, безусловно, у вас будет время попробовать несколько решений и определить фаворита. Мы в этой статье будем показывать всё на примере редактора Nano.

Как создать скрипт

Bash-скрипт — это текстовый файл с расширением .sh, который содержит в себе набор команд для оболочки Bash. Чтобы создать такой файл в Linux, надо запустить терминал и выполнить в нём команду touch. В качестве аргумента следует указать имя нового файла:

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.

Вот как она выглядит в общем виде:

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 для обработки множественных условий. В других языках программирования эта конструкция называется 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 / Skillbox Media

Функции

Функции в 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 / Skillbox Media

Главное

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

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!



Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Практический курс: «Администрирова­ние ОС Linux» Узнать о курсе
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована