
Функция Bash — это, по сути, набор команд, которые можно вызывать многократно. Функция предназначена для того, чтобы сделать ваши скрипты Bash более читабельными и избежать повторного написания одного и того же кода. По сравнению с большинством языков программирования, функции Bash имеют ряд ограничений.
В этом уроке мы рассмотрим основы функций Bash и покажем, как использовать их в скриптах оболочки.
Определение функций Bash
Синтаксис объявления функции в bash прост. Функции можно объявлять в двух различных форматах:
-
Первый формат начинается с имени функции, за которым следуют скобки. Это предпочтительный и наиболее используемый формат.
function_name () { commands }Однострочная версия:
function_name () { commands ; } -
Второй формат начинается с зарезервированного слова
function, за которым следует имя функции.function function_name { commands }Однострочная версия:
function function_name { commands ; }
Следует отметить несколько моментов:
- Команды, заключенные в фигурные скобки (
{}), называются телом функции. Фигурные скобки должны быть отделены от тела пробелами или символами переноса строки. - Определение функции не приводит к её выполнению. Чтобы вызвать функцию bash, просто укажите её имя. Команды в фигурных скобках выполняются при каждом вызове функции в скрипте оболочки.
- Определение функции должно быть размещено до любого вызова функции.
- При использовании однострочных «сжатых» функций после последней команды в функции должна стоять точка с запятой
;. - Всегда старайтесь, чтобы названия ваших функций были описательными.
Чтобы лучше понять это, взгляните на следующий пример:
~/hello_world.sh
#!/bin/bash hello_world () { echo 'hello, world' } hello_world
Давайте проанализируем код построчно:
- В строке 3 мы определяем функцию, присваивая ей имя. Фигурная скобка
{обозначает начало тела функции. - Строка
4— тело функции. Тело функции может содержать несколько команд, операторов и объявлений переменных. - Строка
5, закрывающая фигурная скобка}, определяет конец функцииhello_world. - В строке
7мы выполняем функцию. Вы можете выполнять функцию столько раз, сколько необходимо.
Если запустить скрипт, он выведет hello, world .
Переменные Область действия
Глобальные переменные — это переменные, к которым можно получить доступ из любой точки скрипта, независимо от области действия. В Bash все переменные по умолчанию определены как глобальные, даже если объявлены внутри функции.
Локальные переменные могут быть объявлены внутри тела функции с помощью ключевого слова local и могут использоваться только внутри этой функции. Локальные переменные с одинаковыми именами могут быть в разных функциях.
Чтобы лучше проиллюстрировать, как работает область действия переменных в Bash, рассмотрим следующий пример:
~/variables_scope.sh
#!/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 завершает функцию. Его можно рассматривать как статус выхода функции.
~/return_values.sh
#!/bin/bash my_function () { echo "some result" return 55 } my_function echo $?
some result 55
Чтобы действительно вернуть произвольное значение из функции, нам нужно использовать другие методы. Самый простой вариант — присвоить результат функции глобальной переменной:
~/return_values.sh
#!/bin/bash my_function () { func_result = "some result" } my_function echo $func_result
some result
Другой, более удобный вариант возврата значения из функции — отправка значения в stdout с помощью echo или printf как показано ниже:
~/return_values.sh
#!/bin/bash my_function () { local func_result = "some result" echo " $func_result " } func_result = " $( my_function ) " echo $func_result
some result
Вместо того, чтобы просто выполнить функцию, которая выведет сообщение в stdout, мы присваиваем вывод функции переменной func_result , используя подстановку команды $() . Эту переменную можно использовать позже по мере необходимости.
Передача аргументов в функции Bash
Чтобы передать любое количество аргументов функции bash, просто поместите их сразу после имени функции, разделив пробелом. Рекомендуется заключать аргументы в двойные кавычки, чтобы избежать ошибок в разборе аргументов с пробелами.
- Передаваемые параметры:
$1,$2,$3…$n, что соответствует положению параметра после имени функции. - Переменная
$0зарезервирована для имени функции. - Переменная
$#хранит количество позиционных параметров/аргументов, переданных функции. - Переменные
$*и$@содержат все позиционные параметры/аргументы, переданные функции.- При заключении в двойные кавычки
"$*"расширяется до одной строки, разделенной пробелом (первый символ IFS) —"$1 $2 $n". - При заключении в двойные кавычки
"$@"раскрывается для разделения строк:"$1" "$2" "$n". - Если не заключены в двойные кавычки,
$*и$@считаются одинаковыми.
- При заключении в двойные кавычки
Вот пример:
~/передача_аргументов.sh
#!/bin/bash greeting () { echo "Hello $1 " } greeting "Joe"
Hello Joe
Заключение
Функция Bash — это блок кода многократного использования, предназначенный для выполнения определённой операции. После определения функция может вызываться несколько раз в скрипте.
Возможно, вам также будет интересно почитать о том, как использовать функцию Bash для создания запоминающейся команды быстрого доступа для более длинной команды.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства