Введение
При написании скриптов часто требуется несколько раз повторять один и тот же блок кода. Вместо того чтобы переписывать или копировать этот код, можно использовать функции.
Функция — это именованный блок кода, который выполняет определённую задачу. Вы определяете функцию один раз, а затем вызываете её в нужный момент. Благодаря этому скрипты становятся:
- Модульными: их проще читать и изменять.
- Повторно используемыми: написав код один раз, вы можете использовать его многократно.
- Удобными в сопровождении: если нужно изменить логику, достаточно обновить её в одном месте.
Функции особенно важны потому, что в больших скриптах трудно разобраться, когда вся логика находится в одном длинном блоке, выполняющемся сверху вниз. Разбиение скрипта на функции — один из первых шагов от «быстрого shell-скрипта» к «автоматизации, удобной в сопровождении».
В этой лабораторной работе вы изучите основы переписывания скрипта с использованием функций. Вы:
- Создадите простой скрипт.
- Определите функцию с именем
greet_user. - Вызовете функцию, чтобы выполнить её код.
- Измените функцию так, чтобы она принимала параметры (аргументы).
Создайте файл скрипта
Сначала подготовьте рабочую область. Мы создадим файл functions.sh, в котором будет находиться наш код.
На этом этапе файл скрипта — всего лишь контейнер для кода. Главное в этой лабораторной работе — не сам файл, а принцип организации скрипта в именованные части вместо одной длинной последовательности команд, выполняющейся сверху вниз.
Сначала перейдите в каталог проекта и создайте файл:
cd ~/project
touch functions.sh
Затем откройте файл в текстовом редакторе, чтобы добавить стандартный заголовок Shebang:
nano functions.sh
Добавьте следующую строку в начало файла:
#!/bin/bash
Сохраните файл (Ctrl+O, Enter) и выйдите из редактора (Ctrl+X).
Наконец, сделайте скрипт исполняемым, чтобы позже его можно было запустить:
chmod +x functions.sh
Теперь вы готовы начать писать код.
Определите функцию
Теперь определим функцию с именем greet_user.
В Bash функция определяется так: сначала указывается её имя и круглые скобки (), затем блок кода заключается в фигурные скобки {}.
Функция даёт блоку команд повторно используемое имя. Благодаря этому shell-скрипты становятся понятнее: вместо отдельных команд вы видите действия с осмысленными именами, например backup_files, check_disk или greet_user.
Синтаксис выглядит так:
function_name() {
## Commands to execute
}
Снова откройте скрипт:
nano functions.sh
Добавьте следующее определение функции под строкой Shebang:
#!/bin/bash
greet_user() {
echo "Hello"
}
Важно: на этом этапе мы только определили функцию. Мы ещё не указали скрипту, что её нужно выполнить. Если запустить скрипт сейчас, ничего не произойдёт. Это часто сбивает с толку начинающих: определение функции не приводит к её автоматическому выполнению.
Это различие важно, потому что shell-скрипт читается и выполняется по порядку. Определение функции сообщает Bash, что означает эта функция, но её тело выполняется только после последующего вызова имени функции.
Пока сохраните файл и выйдите из редактора.
Вызовите функцию
Чтобы выполнить код внутри функции, её нужно «вызвать». В Bash для вызова функции достаточно написать её имя в новой строке. При вызове функции не нужно использовать круглые скобки.
Для начинающих это может выглядеть непривычно, поскольку во многих языках программирования при вызове функции используются круглые скобки. В Bash имя greet_user само по себе рассматривается как команда. Если функция с таким именем существует, Bash выполняет её тело.
Откройте скрипт:
nano functions.sh
Добавьте вызов функции в конец файла:
#!/bin/bash
greet_user() {
echo "Hello"
}
## The Main Logic starts here
greet_user
Сохраните файл и выйдите из редактора.
Теперь запустите скрипт:
./functions.sh
При запуске скрипта shell встречает команду greet_user, находит определение функции, выполняет echo "Hello", а затем продолжает работу.
В этом смысле функция похожа на пользовательскую команду, которая существует только внутри текущего скрипта или сеанса shell. Поэтому функции так полезны: с их помощью можно создавать более сложные действия из небольших shell-команд.
Вы должны увидеть следующий вывод:
Hello
Передайте функции аргументы
Функция, которая всегда выполняет одно и то же действие, например выводит Hello, имеет ограниченные возможности. Чтобы сделать её полезнее, можно передавать ей данные. Такие данные называются аргументом.
Внутри функции доступ к аргументам осуществляется через специальные переменные $1, $2 и так далее — так же, как при работе с аргументами скрипта.
$1обозначает первый аргумент, переданный функции.$2обозначает второй аргумент и так далее.
В момент выполнения функции это отдельные значения, не совпадающие с позиционными параметрами самого скрипта. Иными словами, у функции может быть собственный небольшой интерфейс для ввода данных, благодаря чему её удобно повторно использовать с разными значениями.
Изменим функцию так, чтобы она приветствовала конкретного пользователя.
Шаг 1. Обновите определение функции
Откройте файл:
nano functions.sh
Измените функцию greet_user, чтобы она использовала $1 вместо жёстко заданной строки:
greet_user() {
echo "Hello $1"
}
Шаг 2. Обновите вызов функции
Теперь функция ожидает аргумент, поэтому его нужно передать при вызове.
Замените вызов greet_user на greet_user "LabEx".
Теперь файл должен выглядеть так:
#!/bin/bash
greet_user() {
echo "Hello $1"
}
greet_user "LabEx"
Сохраните файл и выйдите из редактора.
Шаг 3. Проверьте скрипт
Снова запустите скрипт:
./functions.sh
Теперь вывод должен быть таким:
Hello LabEx
По сути, вы создали пользовательскую команду, которая принимает входные данные и обрабатывает их. Позже в скрипте вы можете вызвать greet_user "Alice" или greet_user "Bob", и функция адаптируется к переданному значению.
Итоги
В этой лабораторной работе вы изучили основы функций Bash:
- Определение: создание именованного блока кода с помощью
name() { ... }. - Вызов: выполнение функции простым указанием её имени.
- Аргументы: передача данных функции и обращение к ним через
$1,$2и так далее.
Функции — строительные блоки сложных скриптов. Они позволяют организовать логику, сократить повторение кода и сделать скрипты более понятными и удобными в сопровождении.



