bash скрипты для начинающих — урок №10: Функции.

Предыдущий урок: bash скрипты для начинающих — урок №9: Перенаправление вывода.

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

Зачем нужны функции?

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

Улучшение читаемости и структурированности: Скрипт становится проще воспринимать, потому что логика разбита на логические блоки (функции). Это помогает быстрее разобраться в смысле скрипта.

Облегчение отладки и сопровождения: Легко изменять работу отдельной функции, не трогая остальные части скрипта. Это упрощает исправление ошибок и добавление новых возможностей.

Инкапсуляция логики: Можно скрыть сложные или повторяющиеся операции внутри функции, делая основной код более лаконичным.

Модульность и удобство расширения: Можно писать небольшие функции и комбинировать их для создания более сложных сценариев.

Функции

Подготовим очередной файл для урока:

[root@waky bash_practice]# touch script_10.sh
[root@waky bash_practice]# chmod +x script_10.sh
[root@waky bash_practice]#

Шаг 1: Используем простые функции

В простейшем случае функция — это часть кода, который нужно повторить в нескольких местах скрипта. Занесем в script_10.sh следующее содержание:

#!/bin/bash

get_timestamp() {
  timestamp=$(date +%d/%m/%Y-%H:%M:%S)
  echo "Timestamp: $timestamp"
}

get_timestamp
sleep 5
get_timestamp

Проверим результат:

[root@waky bash_practice]# ./script_10.sh
Timestamp: 25/12/2025-09:12:58
Timestamp: 25/12/2025-09:13:03
[root@waky bash_practice]#

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

#!/bin/bash

get_timestamp() {
  timestamp=$(date +%d/%m/%Y-%H:%M:%S)
  echo "Timestamp: $timestamp"
}

get_timestamp
echo "timestamp var outer the function: $timestamp"
sleep 5
get_timestamp
echo "timestamp var outer the function: $timestamp"

Запустим скрипт и проверим результат:

[root@waky bash_practice]# ./script_10.sh
Timestamp: 25/12/2025-09:19:16
timestamp var outer the function: 25/12/2025-09:19:16
Timestamp: 25/12/2025-09:19:21
timestamp var outer the function: 25/12/2025-09:19:21
[root@waky bash_practice]#

Оба раза значение переменной timestamp за пределами функции совпадает со значением, полученным ранее внутри функции. Если вы внутри функции используете имена переменных, которые могут конфликтовать с именами переменных в самом скрипте, используйте локальные переменные:

#!/bin/bash

get_timestamp() {
  local timestamp=$(date +%d/%m/%Y-%H:%M:%S)
  echo "Timestamp: $timestamp"
}

get_timestamp
echo "timestamp var outer the function: $timestamp"
sleep 2
timestamp=$(date +%d/%m/%Y-%H:%M:%S)
sleep 3
get_timestamp
echo "timestamp var outer the function: $timestamp"

Запустим скрипт и проанализируем результат:

[root@waky bash_practice]# ./script_10.sh
Timestamp: 25/12/2025-09:23:55
timestamp var outer the function:
Timestamp: 25/12/2025-09:24:00
timestamp var outer the function: 25/12/2025-09:23:57
[root@waky bash_practice]#

Функция работает так же, как и работала, однако, при первой попытке вывести в самом скрипте переменную timestamp, в строке осталось пустое место. Так как значение переменной было присвоено позже. В данном примере, с помощью директивы  local мы задали локальную переменную в теле функции, эта переменная не связана с такой же переменной в самом скрипте.

Шаг 2: Передаем значения в функцию

Обычно функции используются для обработки, каких либо данных. Давайте разберемся, как передать функции значения для обработки. Перепишем наш скрипт:

#!/bin/bash

calculate_square() {
  local number=$1
  local square=$(( number * number ))
  echo "Square: $square"
}

read -p "Enter a number: " number
calculate_square $number

Данный код использует избыточные переменные, но для демонстрации так будет лучше. С помощью read мы запрашиваем у пользователя ввести число, записываем это число в переменную number. Передаем эту переменную функции. Для функции это первая переменная ($1). Внутри функции записываем первую переменную в локальную переменную number. Далее перемножаем ее саму на себя и записываем результат в переменную square. В конце возвращаем ее значение.

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

#!/bin/bash

calculate_sum() {
  local a=$1
  local b=$2
  local c=$3
  echo "sum: $(( a + b + c ))"
}

read -p "Enter a: " a
read -p "Enter b: " b
read -p "Enter c: " c
calculate_sum $a $b $c

Проверим результат:

[root@waky bash_practice]# ./script_10.sh
Enter a: 1
Enter b: 2
Enter c: 3
sum: 6
[root@waky bash_practice]#

Итоги:

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

Следующий урок: bash скрипты для начинающих — урок №11: Как передать аргументы скрипту.