Bash Функции

Bash Functions

21 Июня 2020 | Терминал


В этом руководстве мы рассмотрим основы функций 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 помощью эха или , 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 переменной, используя $() подстановку команд. Переменная может позже использоваться по мере необходимости.

Передача аргументов в функции 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 для создания запоминающейся команды быстрого доступа для более длинной команды.


    Комментарии

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

Загрузка комментариев...