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

Функция Bash - это, по сути, набор команд, которые можно вызывать множество раз. Цель функции - помочь вам сделать ваши bash-скрипты более читабельными и избежать повторного написания одного и того же кода. По сравнению с большинством языков программирования, функции Bash несколько ограничены.
Определение функций Bash
Синтаксис объявления функции bash прост. Функции могут быть объявлены в двух разных форматах:
-
Первый формат начинается с имени функции, за которым следуют скобки. Это предпочтительный и более используемый формат.
function_name () { commands }
Однострочная версия:
function_name () { commands; }
-
Второй формат начинается с зарезервированного слова
function
, за которым следует имя функции.function function_name { commands }
Однострочная версия:
function function_name { commands; }
Несколько моментов, которые следует отметить:
- Команды между фигурными скобками (
{}
) называются телом функции. Фигурные скобки должны быть отделены от тела пробелами или переводами строки. - Определение функции не выполняет ее. Чтобы вызвать функцию bash, просто используйте имя функции. Команды между фигурными скобками выполняются всякий раз, когда функция вызывается в сценарии оболочки.
- Определение функции должно быть помещено перед любыми вызовами функции.
- При использовании однострочных «уплотненных» функций точка с запятой
;
должна следовать за последней командой в функции. - Всегда старайтесь, чтобы имена ваших функций были описательными.
Чтобы лучше это понять, взглянем на следующий пример:
#!/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 "Inside function: var1: $var1, var2: $var2"
}
echo "Before executing function: var1: $var1, var2: $var2"
my_function
echo "After executing function: var1: $var1, var2: $var2"
Сценарий начинается с определения двух глобальных переменных var1
и var2
. Затем есть функция, которая устанавливает локальную переменную var1
и изменяет глобальную переменную var2
.
Если вы запустите скрипт, вы должны увидеть следующий вывод:
Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D
Из приведенного выше вывода можно сделать вывод, что:
- Когда локальная переменная устанавливается внутри тела функции с тем же именем, что и существующая глобальная переменная, она будет иметь приоритет над глобальной переменной.
- Глобальные переменные могут быть изменены внутри функции.
Возвращаемые значения
В отличие от функций в «реальных» языках программирования, функции Bash не позволяют вам возвращать значение при вызове. Когда функция bash завершает свою работу, ее возвращаемое значение является состоянием последнего оператора, выполненного в функции, 0
для успеха и ненулевого десятичного числа в диапазоне 1 - 255 для отказа.
Статус возврата можно указать с помощью return
ключевого слова, и оно присваивается переменной $?
. return
Оператор завершает функцию. Вы можете думать об этом как о состоянии выхода из функции .
#!/bin/bash
my_function () {
echo "some result"
return 55
}
my_function
echo $?
some result
55
Чтобы на самом деле вернуть произвольное значение из функции, нам нужно использовать другие методы. Самый простой вариант - присвоить результат функции глобальной переменной:
#!/bin/bash
my_function () {
func_result="some result"
}
my_function
echo $func_result
some result
Другой, лучший вариант для возврата значения из функции отправить значение с stdout
помощью эха или , printf
как показано ниже:
#!/bin/bash
my_function () {
local func_result="some result"
echo "$func_result"
}
func_result="$(my_function)"
echo $func_result
some result
Вместо того, чтобы просто выполнять функцию, которая будет печатать сообщение на стандартный вывод, мы назначаем вывод функции func_result
переменной, используя $()
подстановку команд. Переменная может позже использоваться по мере необходимости.
Передача аргументов в функции Bash
Чтобы передать любое количество аргументов функции bash, просто поместите их сразу после имени функции, разделив их пробелом. Хорошей практикой является двойная кавычка аргументов, чтобы избежать неправильного разбора аргумента с пробелами в нем.
- Передаваемые параметры
$1
,$2
,$3
...$n
, соответствующее положению параметра после имени функции. $0
Переменная зарезервирована для имени функции.$#
Переменная содержит число позиционных параметров / аргументов , передаваемых функции.$*
И$@
переменные содержат все позиционные параметры / аргументы , переданные функции.- При двойных кавычках
"$*"
раскрывается в одну строку, разделенную пробелом (первый символ IFS) -"$1 $2 $n"
. - При двойных кавычках
"$@"
расширяется до отдельных строк -"$1" "$2" "$n"
. - Когда не двойные кавычки,
$*
а$@
одинаковые.
- При двойных кавычках
Вот пример:
#!/bin/bash
greeting () {
echo "Hello $1"
}
greeting "Joe"
Hello Joe
Вывод
Функция Bash - это блок многократно используемого кода, предназначенный для выполнения определенной операции. После определения функция может вызываться несколько раз в скрипте.
Вы также можете прочитать о том, как использовать функцию Bash для создания запоминающейся команды быстрого доступа для более длинной команды.