Введение
Функция 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
с помощью echo
или 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 для создания псевдонима с помощью bash.