Функции Bash

Функции Bash

Функция Bash — это, по сути, набор команд, которые можно вызывать многократно. Функция предназначена для того, чтобы сделать ваши скрипты Bash более читабельными и избежать повторного написания одного и того же кода. По сравнению с большинством языков программирования, функции Bash имеют ряд ограничений.

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

Определение функций Bash

Синтаксис объявления функции в bash прост. Функции можно объявлять в двух различных форматах:

  1. Первый формат начинается с имени функции, за которым следуют скобки. Это предпочтительный и наиболее используемый формат.

     function_name () { commands }

    Однострочная версия:

     function_name () { commands ; }
  2. Второй формат начинается с зарезервированного слова 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 для создания запоминающейся команды быстрого доступа для более длинной команды.

Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.

терминал bash

Связанные руководства

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *