Thank you for reading this post, don't forget to subscribe!
Bash-функция – это, по сути, набор команд, которые можно вызывать множество раз. Цель функции – помочь вам сделать ваши bash-скрипты более читабельными и избежать повторного написания одного и того же кода.По сравнению с большинством языков программирования, функции Bash довольно ограничены. В этой статье мы рассмотрим основы функций Bash и покажем, как их использовать в сценариях оболочки.
Декларация функции Bash
Синтаксис объявления функции bash очень прост. Они могут быть объявлены в двух разных форматах:
- Первый формат начинается с имени функции, за которым следуют скобки. Тело функции должно быть заключено в фигурные скобки
{}.
123function_name () {commands}
Однолинейная версия:
1function_name () { commands; } - Второй формат начинается с зарезервированного слова
function, за которым следует имя функции. Фигурные скобки{}не являются обязательными.123function function_name {commands}Однолинейная версия:
1function function_name { commands;}
Несколько моментов, которые следует отметить:
- Список команд между фигурными скобками
{}– это тело функции. Фигурные скобки, которые окружают тело функции, должны быть отделены от тела пробелами или символами новой строки. - Определение функции не выполняет ее. Чтобы вызвать функцию bash, просто используйте имя функции. Команды между фигурными скобками выполняются всякий раз, когда функция вызывается в сценарии оболочки.
- Определение функции должно быть помещено перед любыми вызовами функции.
- При использовании однострочных «уплотненных» функций точка с запятой
;должна следовать за последней командой в функции. - Вы всегда должны стараться, чтобы имена ваших функций были описательными.
Чтобы лучше это понять, взглянем на следующий пример:
|
1 2 3 4 5 |
#!/bin/bash hello_world () { echo 'hello, world' } hello_world |
Давайте проанализируем код построчно:
- В строке
3мы определяем функцию, присваивая ей имя и открывая фигурную скобку,{которая обозначает начало тела функции. - Линия
4– это тело функции. Тело функции может содержать несколько команд. - Линия
5, закрывающая фигурная скобка}, определяет конец функцииhello_world. - В строке
7мы выполняем функцию. Вы можете выполнять функцию столько раз, сколько вам нужно.
Если вы запустите скрипт, он напечатает hello, world.
Область переменных
Глобальные переменные – это переменные, к которым можно получить доступ из любого места в скрипте независимо от области видимости. В Bash все переменные по умолчанию определены как глобальные, даже если они объявлены внутри функции.
Локальные переменные могут быть объявлены в теле функции с ключевым словом local и могут использоваться только внутри этой функции. Вы можете иметь локальные переменные с одинаковыми именами в разных функциях.
Чтобы лучше проиллюстрировать, как работает область видимости переменных в Bash, давайте рассмотрим пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/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.
Если вы запустите скрипт, вы должны увидеть следующий вывод:
|
1 2 3 |
Перед выполнением функции: var1: A, var2: B Внутренняя функция: var1: C, var2: D После выполнения функции: var1: A, var2: D |
Из приведенного выше вывода можно сделать вывод, что:
- Если вы установите локальные переменные внутри тела функции с тем же именем, что и у существующей глобальной переменной, она будет иметь приоритет над глобальной переменной.
- Глобальные переменные могут быть изменены внутри функции.
Возвращаемые значения
В отличие от функций в «реальных» языках программирования, функции Bash не позволяют вам возвращать значение при вызове. Когда функция bash завершает свою работу, ее возвращаемое значение является состоянием последнего оператора, выполненного в функции, 0 для успеха и ненулевого десятичного числа в диапазоне 1 – 255 для отказа.
Статус возврата можно указать с помощью ключевого слова return, и оно присваивается переменной $?. Оператор return завершает функцию. Вы можете думать об этом как о состоянии выхода из функции.
|
1 2 3 4 5 6 7 8 9 |
#!/bin/bash my_function () { echo "некоторый результат" return 23 } my_function echo $? |
|
1 2 |
некоторый результат 23 |
Чтобы фактически вернуть произвольное значение из функции, нам нужно использовать другие методы. Самый простой вариант – присвоить результат функции глобальной переменной:
|
1 2 3 4 5 6 7 8 |
#!/bin/bash my_function () { func_result="некоторый результат" } my_function echo $func_result |
|
1 |
некоторый результат |
Другой, лучший вариант для возврата значения из функции – это отправить значение в stdout, использование echo или printf как показано ниже:
|
1 2 3 4 5 6 7 8 9 |
#!/bin/bash my_function () { local func_result="некоторый результат" echo "$func_result" } func_result="$(my_function)" echo func_result |
|
1 |
некоторый результат |
Вместо того, чтобы просто выполнять функцию, которая будет печатать сообщение на стандартный вывод, мы назначаем переменную func_result с помощью механизма $(). Используя этот метод, переменная func_result содержит результат функции.
Передача аргументов в функции Bash
Чтобы передать любое количество аргументов функции bash, просто поместите их сразу после имени функции, разделив их пробелом. Рекомендуется использовать двойные кавычки аргументов, чтобы избежать неправильного разбора аргумента с пробелами в нем.
- Передаваемые параметры
$1,$2,$3…$n, соответствующее положению параметра после имени функции. - Переменная
$0зарезервирована для имени функции. - Переменная
$#содержит число позиционных параметров/аргументов, передаваемых функции. - Переменная
$*или$@содержит все позиционные параметры/аргументы, переданные функции.
Вот пример:
|
1 2 3 4 5 6 7 |
#!/bin/bash greeting () { echo "Привет $1" } greeting "AndreyEx" |
|
1 |
Привет AndreyEx |