Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Инструкция по написанию скриптов в Linux Bash

Илья Ушаков
Илья Ушаков
Технический писатель
14 апреля 2023 г.
10966
13 минут чтения
Средний рейтинг статьи: 4.5

Bash (Bourne-Again SHell) — это командный интерпретатор в UNIX-подобных операционных системах, который позволяет автоматизировать задачи на уровне командной строки. Bash-скрипты — это файлы, содержащие последовательность команд, которые могут быть выполнены с помощью интерпретатора Bash. 

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

В этой статье мы рассмотрим основные концепции и инструменты для написания Bash-скриптов в Linux.

Синтаксис Bash-скриптов

Bash-скрипты могут быть написаны в любом текстовом редакторе и должны иметь права на выполнение. Рассмотрим некоторые из наиболее популярных редакторов:

  1. Nano — это простой текстовый редактор, который поставляется вместе с большинством дистрибутивов Linux. Он имеет простой и интуитивно понятный интерфейс, а также некоторые дополнительные полезные функции, такие как подсветка синтаксиса.
  2. Vim — это один из самых популярных текстовых редакторов для Linux, хотя он может показаться сложным для начинающих. Vim имеет множество функций, которые помогают ускорить процесс написания кода, такие как подсветка синтаксиса, автодополнение и макросы.
  3. Emacs — это еще один популярный текстовый редактор для Linux. Он также имеет множество функций, которые могут значительно упростить процесс написания кода. Одна из его главных особенностей — это возможность запуска интерпретатора Bash внутри редактора, что позволяет тестировать скрипты без выхода из редактора.

В начале каждого скрипта должна быть строка, называемая шебанг (shebang), которая сообщает операционной системе, какой интерпретатор использовать для выполнения скрипта. Шебанг должен начинаться с символа решетки (#) и следующим за ним символ восклицания (!), после которых указывается путь к интерпретатору. Для использования интерпретатора Bash, шебанг будет выглядеть следующим образом:

#!/bin/bash

Также во время написания скрипта можно оставлять комментарии, которые начинаются с символа решетки и продолжаются до конца строки. Комментарии не будут выполнены интерпретатором и используются для описания функциональности скрипта. Например:

# Это комментарий

Ниже напишем свой первый скрипт. Допустим, мы хотим создать скрипт в Linux, который приветствует пользователя и выводит текущую дату и время на экран. Для этого создадим файл greeting.sh в любой директории нашего компьютера и добавим следующий код:

#!/bin/bash
echo "Hello, $USER!"
echo "Today is $(date)"

Первая строка указывает на то, что это скрипт на Bash. Следующая строка echo "Hello, $USER!" выводит приветствие с именем текущего пользователя. $USER является системной переменной, которая содержит имя текущего пользователя. А третья строка echo "Today is $(date)" выводит текущую дату и время. $(date) используется для вызова команды date, которая возвращает текущую дату и время в формате, указанном в настройках системы.

Создавая скрипт на Bash, важно убедиться, что файл можно будет исполнять. Для этого необходимо изменить права доступа к файлу. Об этом, а также о запуске написанного скрипта мы поговорим в следующей главе.

Запуск скриптов

Для запуска скрипта в Linux необходимо дать ему права на выполнение. Чтобы сделать файл исполняемым, можно воспользоваться командой chmod (от англ. change mode — изменить режим). С помощью этой команды вы можете изменять права доступа к файлам и директориям в Linux.

Команда chmod имеет следующий синтаксис:

chmod [опции] права_доступа файл

где права_доступа — это специальный код, который задает права доступа к файлу или директории, а файл — это путь к файлу или директории, права доступа которой нужно изменить.

Для того чтобы сделать файл исполняемым, нужно добавить к его правам доступа бит исполнения (x). 

Например, сделаем файл greeting.sh исполняемым, для этого используем следующую команду:

chmod +x greeting.sh

Эта команда добавит права на выполнение для текущего пользователя. Теперь мы можем запустить Bash-скрипт в Linux, вызвав его из терминала:

./greeting.sh

Результат выполнения скрипта продемонстрирован на картинке ниже.

Image5

Параметры командной строки

Параметры командной строки позволяют передавать аргументы в скрипты Linux при его запуске. Параметры командной строки могут быть доступны в скрипте как $1, $2, $3 и т.д., где $1 — это первый параметр, $2 — второй параметр и т.д.

Перепишем скрипт из предыдущей главы для приветствия пользователя:

#!/bin/bash
echo "Hello, $1!”

А затем запустим скрипт, передав ему аргумент $USER:

./greeting.sh $USER

Результат запуска представлен на картинке ниже.

Image8

Кроме того, возможно использовать специальные параметры командной строки:

  • $0 — имя скрипта (то есть, имя файла, который был запущен)
  • $# — количество переданных параметров
  • $* или $@ — список всех переданных параметров (в виде одной строки или массива соответственно)
  • $? — код возврата последней выполненной команды

Например, чтобы вывести на экран количество переданных параметров, можно использовать следующий код:

#!/bin/bash
echo "Hello, " $1 “!”
echo "Количество переданных параметров: $#"

Результат запуска скрипта представлен на картинке ниже.

Image1

Переменные

Переменные в Bash используются для хранения данных, таких как строки и числа. Они могут быть определены явно, путем присвоения значения, или неявно, путем автоматического присвоения значения при выполнении определенных операций. Для создания переменной в Bash необходимо присвоить ей значение, используя знак равенства (=). Например:

company="Timeweb"

Обратите внимание, что не должно быть пробелов между именем переменной, знаком равенства и значением.

Значение переменной можно получить, указав ее имя после команды echo и знака $. Например:

echo $company

Также возможно присвоить значение переменной через ввод с клавиатуры с помощью команды read. Например, следующий скрипт запрашивает у пользователя имя и сохраняет его в переменной:

#!/bin/bash
echo "What is your name?"
read name
echo "Hello, $name!"

Результат работы данного скрипта представлен на картинке ниже.

Image11

В Bash доступны несколько специальных переменных, которые автоматически определяются и заполняются системой. Например, переменная $HOME содержит путь к домашней директории пользователя, а $PWD содержит путь к текущей рабочей директории. 

Кроме этого, доступны переменные окружения, которые определяются системой и могут использоваться в скриптах. Например, $PATH содержит список директорий, в которых Bash ищет исполняемые файлы.

Переменные также могут использоваться для передачи значений между различными командами и скриптами. Например, для передачи значения переменной из одного скрипта в другой, необходимо использовать команду export:

export название_переменной

Условные операторы

Условные операторы — это конструкции, которые позволяют выполнить определенный набор действий в зависимости от истинности или ложности какого-то условия. В Bash-скриптах условия записываются в скобках и передаются в команду if

Синтаксис оператора if выглядит следующим образом:

if [ условие ]
then
  команды, которые нужно выполнить, если условие верно
fi

Здесь в квадратных скобках указывается условие, которое необходимо проверить. Если условие истинно, то будут выполнены команды, указанные между then и fi.

Например, напишем скрипт в Linux chetnechet.sh, который будет проверять, является ли число, введенное пользователем, четным или нечетным:

#!/bin/bash
echo "Введите число: "
read n
if (( $n % 2 == 0 ))
then
  echo "Число $n четное"
else
  echo "Число $n нечетное"
fi

В этом примере мы использовали оператор %, который вычисляет остаток от деления на 2. Если остаток равен 0, то число четное, иначе — нечетное.

Результат работы скрипта представлен на картинке ниже.

Image9

Кроме того, существует несколько операторов сравнения, которые можно использовать в условных конструкциях:

  • -eq – равно;
  • -ne – не равно;
  • -gt – больше;
  • -lt – меньше;
  • -ge – больше или равно;
  • -le – меньше или равно.

Например, чтобы проверить, является ли переменная $a больше переменной $b, можно написать следующее:

if [ $a -gt $b ]
then
  echo "$a больше $b"
fi

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

Кроме if, в Bash-скриптах также используется конструкция case. Эта конструкция позволяет проверять значение переменной на соответствие нескольким вариантам. Но об этом мы поговорим в следующей главе.

Конструкция Case

Конструкция case в bash-скриптах позволяет упростить написание условных операторов для сравнения переменных с несколькими возможными значениями.

Синтаксис конструкции case выглядит следующим образом:

case variable in
    pattern1)
        command1
        ;;
    pattern2)
        command2
        ;;
    pattern3)
        command3
        ;;
    *)
        default command
        ;;
esac

Где variable — это переменная, которую нужно проверить, pattern1, pattern2, pattern3 — это возможные значения, которые нужно проверить, и command1, command2, command3 — это команды, которые нужно выполнить в зависимости от значения переменной.

Символ * в конце списка значений используется как обработчик по умолчанию, если ни одно из значений не соответствует переменной.

Для примера, давайте рассмотрим скрипт, который проверяет день недели и выполняет соответствующее действие:

#!/bin/bash

day=$(date +%u)

case $day in
    1)
        echo "Сегодня понедельник"
        ;;
    2)
        echo "Сегодня вторник"
        ;;
    3)
        echo "Сегодня среда"
        ;;
    4)
        echo "Сегодня четверг"
        ;;
    5)
        echo "Сегодня пятница"
        ;;
    6)
        echo "Сегодня суббота"
        ;;
    7)
        echo "Сегодня воскресенье"
        ;;
    *)
        echo "Некорректное значение дня недели"
        ;;
esac

В этом примере мы используем переменную day, которую мы определяем с помощью команды date +%u. В данном случае, %u используется для получения числового значения дня недели от 1 (понедельник) до 7 (воскресенье). Затем мы сравниваем эту переменную с днями недели, используя конструкцию case. Если ее значение соответствует определенному значению дня недели, то мы выводим соответствующее сообщение. Если значение не соответствует перечисленным дням недели, мы выводим сообщение об ошибке.

Результат работы скрипта продемонстрирован на картинке ниже.

Image3

Циклы

Циклы в Bash используются для выполнения повторяющихся действий. Существуют два типа циклов: цикл for и цикл while.

Цикл for используется для выполнения команд для каждого элемента из списка.

Синтаксис цикла for выглядит следующим образом:

for переменная in список
do
  команды
done

Здесь переменная принимает значение элемента из списка, после чего для каждого из них выполняются команды, указанные между do и done.

Пример:

#!/bin/bash

for i in {1..10}; do
    echo "Number: $i"
done

В этом примере i принимает значения от 1 до 10, и для каждого из них будет выполнена команда echo "Number: $i". Результат выполнения этого цикла будет выглядеть следующим образом:

Image10

Следующий цикл while используется для выполнения команд до тех пор, пока условие не станет ложным. Синтаксис цикла while выглядит следующим образом:

while [ условие ]
do
  команды
done

Здесь в квадратных скобках указывается условие, которое проверяется перед каждой итерацией цикла. Команды, указанные между do и done, будут выполнены до тех пор, пока условие остается истинным.

Пример:

#!/bin/bash

count=1
while [ $count -le 10 ]; do
    echo "Count: $count"
    count=$((count+1))
done

В этом примере count увеличивается на 1 после каждой итерации цикла. Когда значение count достигает 10, цикл завершается. Результат выполнения этого цикла будет выглядеть следующим образом:

Image4

Функции

Функции в Bash используются для группировки команд в логически связанные блоки. Функции могут быть вызваны из скрипта с помощью имени функции. 

Синтаксис функции выглядит следующим образом:

название_функции () {
    команды_и_выражения
}

Название функции должно начинаться с буквы или символа подчеркивания и может содержать только буквы, цифры и символы подчеркивания. За названием функции следует список аргументов в скобках. Команды и выражения, которые должны быть выполнены при вызове функции, должны быть внутри фигурных скобок.

Вот пример функции, которая выводит текущее время и дату:

#!/bin/bash

print_date () {
    echo "Сегодняшняя дата: $(date)"
}

print_date #Вызов функции

Результат работы скрипта представлен на картинке ниже.

Image13

Функции также могут иметь аргументы, которые передаются в качестве параметров внутри скобок при их вызове. Вот пример функции, которая принимает два аргумента и выводит их сумму:

#!/bin/bash

sum_numbers () {
    result=$(( $1 + $2 ))
    echo "Сумма чисел $1 и $2 равна $result"
}

sum_numbers 10 20 #Вызов функции

В этом примере $1 и $2 — это переменные, которые содержат значения первого и второго аргументов соответственно. sum_numbers 10 20 вызовет функцию sum_numbers с аргументами 10 и 20 и выведет следующий результат:

Image2

Функции также могут возвращать значения при помощи ключевого слова return. Перепишем прошлый пример, используя новые знания:

#!/bin/bash

sum_numbers () {
    result=$(( $1 + $2 ))
    return $result
}

sum_numbers 12 24 #Вызов функции
echo "Сумма чисел равна $?" #Вывод

Здесь результат сохраняется в переменную result и возвращается из функции с помощью команды return.

Переменная $? содержит код возврата функции, то есть в данном случае — результат вычисления суммы.

Результат работы скрипта представлен на картинке ниже.

Image12

Есть и другой способ взаимодействия с результатом вызова функции, помимо return. Немного перепишем код прошлого скрипта:

#!/bin/bash

sum_numbers () {
    result=$(( $1 + $2 ))
    echo $result
}
sum=$(sum_numbers 9 11)
echo "Сумма чисел равна $sum" #Вывод

Здесь, вместо использования $? и return, мы сохраняем результат вызова функции в переменную sum и затем выводим ее значение на экран. Результат продемонстрирован на картинке ниже.

Image7

Работа с файлами и директориями

Bash-скрипты могут использоваться для выполнения различных операций с файлами и директориями в Linux. Например, чтобы проверить существование файла, можно использовать команду: 

test -e filename 

Если файл существует, то команда вернет значение 0, в противном случае — ненулевое значение. Для работы с директориями в Bash-скриптах можно использовать команды cd, mkdir, rmdir, ls и т.д.

Отладка скриптов

Отладка Bash-скриптов может оказаться трудной задачей, поскольку проблемы могут быть вызваны различными факторами, такими как ошибки синтаксиса, неправильное использование переменных или функций и т.д. Для отладки Bash-скриптов можно использовать такие инструменты, как set -x, set -v и set -e

Команда set -x позволяет выводить на экран команды перед их выполнением, команда set -v выводит на экран значения переменных перед их использованием, а set -e прерывает выполнение скрипта в случае ошибки.

Заключение

Bash-скрипты — это инструмент для автоматизации задач в UNIX-подобных операционных системах. В этой статье мы рассмотрели основные концепции и инструменты для написания Bash-скриптов, такие как синтаксис, переменные, условные операторы, циклы, функции и запуск скриптов. Надеемся, что эта инструкция поможет вам стать более продуктивным и опытным пользователем Linux.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону