Революции нужны, чтобы уничтожать революционеров (М. Горький).

Функции Bash

4 мин для чтения
FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
16 января 2019
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 "Внутренняя функция: var1: $var1, var2: $var2"
}

echo "Перед выполнением функции: var1: $var1, var2: $var2"

my_function

echo "После выполнения функции: var1: $var1, var2: $var2"

 

Сценарий начинается с определения двух глобальных переменных var1и var2. Затем функция, устанавливает локальную переменную var1 и изменяет глобальную переменную var2.

Если вы запустите скрипт, вы должны увидеть следующий вывод:

Перед выполнением функции: var1: A, var2: B
Внутренняя функция: var1: C, var2: D
После выполнения функции: var1: A, var2: D

 

Из приведенного выше вывода можно сделать вывод, что:

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

Возвращаемые значения

В отличие от функций в «реальных» языках программирования, функции Bash не позволяют вам возвращать значение при вызове. Когда функция bash завершает свою работу, ее возвращаемое значение является состоянием последнего оператора, выполненного в функции, 0 для успеха и ненулевого десятичного числа в диапазоне 1 – 255 для отказа.

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

~ / Return_values.sh
#!/bin/bash

my_function () {
  echo "некоторый результат"
  return 23
}

my_function
echo $?

 

некоторый результат
23

 

Чтобы фактически вернуть произвольное значение из функции, нам нужно использовать другие методы. Самый простой вариант – присвоить результат функции глобальной переменной:

~ / Return_values.sh
#!/bin/bash

my_function () {
  func_result="некоторый результат"
}

my_function
echo $func_result

 

некоторый результат

 

Другой, лучший вариант для возврата значения из функции – это отправить значение в stdout, использование echo или printf как показано ниже:

~ / Return_values.sh
#!/bin/bash

my_function () {
  local func_result="некоторый результат"
  echo "$func_result"
}

func_result="$(my_function)"
echo func_result

 

некоторый результат

 

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

 

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

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

  • Передаваемые параметры $1$2$3… $n, соответствующее положению параметра после имени функции.
  • Переменная $0 зарезервирована для имени функции.
  • Переменная $# содержит число позиционных параметров/аргументов, передаваемых функции.
  • Переменная $* или $@ содержит все позиционные параметры/аргументы, переданные функции.

Вот пример:

~ / Passing_arguments.sh
#!/bin/bash

greeting () {
  echo "Привет $1"
}

greeting "AndreyEx"

 

Привет AndreyEx

 

Заключение

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

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Просмотров: 43

Если статья понравилась, то поделитесь ей в социальных сетях:

Отправить ответ

Войти с помощью: 
avatar
  Подписаться  
Уведомление о

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить
galka

Спасибо! Ваша заявка принята

close
galka

Спасибо! Ваша заявка принята

close