Bash-функция — это, по сути, набор команд, которые можно вызывать множество раз. Цель функции — помочь вам сделать ваши bash-скрипты более читабельными и избежать повторного написания одного и того же кода.По сравнению с большинством языков программирования, функции Bash довольно ограничены. В этой статье мы рассмотрим основы функций Bash и покажем, как их использовать в сценариях оболочки.
Синтаксис объявления функции bash очень прост. Они могут быть объявлены в двух разных форматах:
{}
.function_name () { commands }
Однолинейная версия:
function_name () { commands; }
function
, за которым следует имя функции. Фигурные скобки {}
не являются обязательными.function function_name { commands }
Однолинейная версия:
function function_name { commands;}
Несколько моментов, которые следует отметить:
{}
— это тело функции. Фигурные скобки, которые окружают тело функции, должны быть отделены от тела пробелами или символами новой строки.;
должна следовать за последней командой в функции.Чтобы лучше это понять, взглянем на следующий пример:
#!/bin/bash hello_world () { echo 'hello, world' } hello_world
Давайте проанализируем код построчно:
3
мы определяем функцию, присваивая ей имя и открывая фигурную скобку, {
которая обозначает начало тела функции.4
— это тело функции. Тело функции может содержать несколько команд.5
, закрывающая фигурная скобка }
, определяет конец функции hello_world
.7
мы выполняем функцию. Вы можете выполнять функцию столько раз, сколько вам нужно.Если вы запустите скрипт, он напечатает hello, world
.
Глобальные переменные — это переменные, к которым можно получить доступ из любого места в скрипте независимо от области видимости. В Bash все переменные по умолчанию определены как глобальные, даже если они объявлены внутри функции.
Локальные переменные могут быть объявлены в теле функции с ключевым словом local
и могут использоваться только внутри этой функции. Вы можете иметь локальные переменные с одинаковыми именами в разных функциях.
Чтобы лучше проиллюстрировать, как работает область видимости переменных в Bash, давайте рассмотрим пример:
#!/bin/bash var1='A' var2='B' my_function () { local var1='C' var2='D' echo "Внутренняя функция: var1: $var1, var2: $var2" } echo "Перед выполнением функции: var1: $var1, var2: $var2" my_function echo "После выполнения функции: var1: $var1, var2: $var2"
Сценарий начинается с определения двух глобальных переменных var1
и var2
. Затем функция, устанавливает локальную переменную var1
и изменяет глобальную переменную var2
.
Если вы запустите скрипт, вы должны увидеть следующий вывод:
Перед выполнением функции: var1: A, var2: B Внутренняя функция: var1: C, var2: D После выполнения функции: var1: A, var2: D
Из приведенного выше вывода можно сделать вывод, что:
В отличие от функций в «реальных» языках программирования, функции Bash не позволяют вам возвращать значение при вызове. Когда функция bash завершает свою работу, ее возвращаемое значение является состоянием последнего оператора, выполненного в функции, 0
для успеха и ненулевого десятичного числа в диапазоне 1 — 255 для отказа.
Статус возврата можно указать с помощью ключевого слова return
, и оно присваивается переменной $?
. Оператор return
завершает функцию. Вы можете думать об этом как о состоянии выхода из функции.
#!/bin/bash my_function () { echo "некоторый результат" return 23 } my_function echo $?
некоторый результат 23
Чтобы фактически вернуть произвольное значение из функции, нам нужно использовать другие методы. Самый простой вариант — присвоить результат функции глобальной переменной:
#!/bin/bash my_function () { func_result="некоторый результат" } my_function echo $func_result
некоторый результат
Другой, лучший вариант для возврата значения из функции — это отправить значение в stdout
, использование echo
или printf
как показано ниже:
#!/bin/bash my_function () { local func_result="некоторый результат" echo "$func_result" } func_result="$(my_function)" echo func_result
некоторый результат
Вместо того, чтобы просто выполнять функцию, которая будет печатать сообщение на стандартный вывод, мы назначаем переменную func_result
с помощью механизма $()
. Используя этот метод, переменная func_result
содержит результат функции.
Чтобы передать любое количество аргументов функции bash, просто поместите их сразу после имени функции, разделив их пробелом. Рекомендуется использовать двойные кавычки аргументов, чтобы избежать неправильного разбора аргумента с пробелами в нем.
$1
, $2
, $3
… $n
, соответствующее положению параметра после имени функции.$0
зарезервирована для имени функции.$#
содержит число позиционных параметров/аргументов, передаваемых функции.$*
или $@
содержит все позиционные параметры/аргументы, переданные функции.Вот пример:
#!/bin/bash greeting () { echo "Привет $1" } greeting "AndreyEx"
Привет AndreyEx
К настоящему времени вы должны хорошо понимать, как писать функции bash. Вы также можете прочитать о том, как использовать функцию Bash для создания запоминающейся команды быстрого доступа для более длинной команды.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.