Основы функций Shell

ShellBeginner
Практиковаться сейчас

Введение

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

Функция — это именованный блок кода, который выполняет определённую задачу. Вы определяете функцию один раз, а затем вызываете её в нужный момент. Благодаря этому скрипты становятся:

  • Модульными: их проще читать и изменять.
  • Повторно используемыми: написав код один раз, вы можете использовать его многократно.
  • Удобными в сопровождении: если нужно изменить логику, достаточно обновить её в одном месте.

Функции особенно важны потому, что в больших скриптах трудно разобраться, когда вся логика находится в одном длинном блоке, выполняющемся сверху вниз. Разбиение скрипта на функции — один из первых шагов от «быстрого shell-скрипта» к «автоматизации, удобной в сопровождении».

В этой лабораторной работе вы изучите основы переписывания скрипта с использованием функций. Вы:

  1. Создадите простой скрипт.
  2. Определите функцию с именем greet_user.
  3. Вызовете функцию, чтобы выполнить её код.
  4. Измените функцию так, чтобы она принимала параметры (аргументы).

Создайте файл скрипта

Сначала подготовьте рабочую область. Мы создадим файл 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:

  1. Определение: создание именованного блока кода с помощью name() { ... }.
  2. Вызов: выполнение функции простым указанием её имени.
  3. Аргументы: передача данных функции и обращение к ним через $1, $2 и так далее.

Функции — строительные блоки сложных скриптов. Они позволяют организовать логику, сократить повторение кода и сделать скрипты более понятными и удобными в сопровождении.