Функции 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

Вместо того чтобы просто выполнять функцию, которая выводит сообщение на стандартный вывод, мы назначаем вывод func_result переменной func_result с помощью func_result команды $() . В дальнейшем эту переменную можно будет использовать по мере необходимости.

Передача аргументов в функции Bash

Чтобы передать любое количество аргументов функции bash, просто поместите их сразу после имени функции, разделив пробелом. Рекомендуется заключать аргументы в двойные кавычки, чтобы избежать неправильного разбора аргумента с пробелами.

  • Передаваемые параметры: $1 , $2 , $3$n , соответствующие позиции параметра после имени функции.
  • Переменная $0 зарезервирована для имени функции.
  • Переменная $# содержит количество позиционных параметров / аргументов, переданных функции.
  • Переменные $* и $@ содержат все позиционные параметры / аргументы, переданные функции.
    • В двойных кавычках "$*" заменяется одной строкой, разделенной пробелом (первый символ IFS) — "$1 $2 $n" .
    • В двойных кавычках "$@" заменяется на отдельные строки — "$1" "$2" "$n" .
    • Если не заключать в двойные кавычки, $* и $@ одинаковы.

Вот пример:

~/passing_arguments.sh
#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Joe"
Hello Joe

Выводы

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

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

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

Оставьте комментарий