Подобно «настоящим» языкам программирования, Bash тоже имеет функции, хотя и в несколько ограниченном варианте. Функция — это подпрограмма, блок кода который реализует набор операций, своего рода «черный ящик» , предназначенный для выполнения конкретной задачи. Функции могут использоваться везде, где имеются участки повторяющегося кода.
Вторая форма записи ближе к сердцу C-программистам (она же более переносимая).
Как и в языке C, скобка, открывающая тело функции, может помещаться на следующей строке.
Вызов функции осуществляется простым указанием ее имени в тексте сценария.
Пример 22-1. Простая функция
Функция должна быть объявлена раньше, чем ее можно будет использовать. К сожалению, в Bash нет возможности «опережающего объявления» функции, как например в C.
Допускается даже создание вложенных функций, хотя пользы от этого немного.
Объявление функции может размещаться в самых неожиданных местах.
22.1. Сложные функции и сложности с функциями
Функции могут принимать входные аргументы и возвращать код завершения.
Доступ к входным аргументам, в функциях, производится посредством позиционных параметров, т.е. $1, $2 и так далее.
Пример 22-2. Функция с аргументами
Команда shift вполне применима и к аргументам функций (см. Пример 33-10).
В отличие от других языков программирования, в сценариях на языке командной оболочке, в функции передаются аргументы по значению. [1] Если имена переменных (которые фактически являются указателями) передаются функции в виде аргументов, то они интерпретируются как обычные строки символов и не могут быть разыменованы. Функции интерпретируют свои аргументы буквально.
Exit и Return
Функции возвращают значение в виде кода завершения. Код завершения может быть задан явно, с помощью команды return, в противном случае будет возвращен код завершения последней команды в функции ( 0 — в случае успеха, иначе — ненулевой код ошибки). Код завершения в сценарии может быть получен через переменную $?.
Завершает исполнение функции. Команда return [2] может иметь необязательный аргумент типа integer , который возвращается в вызывающий сценарий как «код завершения» функции, это значение так же записывается в переменную $?.
Пример 22-3. Наибольшее из двух чисел
Для случаев, когда функция должна возвращать строку или массив, используйте специальные переменные.
Пример 22-4. Преобразование чисел в римскую форму записи
Наибольшее положительное целое число, которое может вернуть функция — 255. Команда return очень тесно связана с понятием код завершения, что объясняет это специфическое ограничение. К счастью существуют различные способы преодоления этого ограничения.
Пример 22-5. Проверка возможности возврата функциями больших значений
Как видно из примера, функции могут возвращать большие отрицательные значения (имеются ввиду — большие по своему абсолютному значению, прим. перев.). Используя эту особенность, можно обыграть возможность получения от функций большие положительные значения.
Еще один способ — использовать глобальные переменные для хранения «возвращаемого значения» .
Пример 22-6. Сравнение двух больших целых чисел
Упражнение: Используя только что полученные знания, добавьте в предыдущий пример, преобразования чисел в римскую форму записи, возможность обрабатывать большие числа.
Перенаправление
Перенаправление ввода для функций
Функции — суть есть блок кода, а это означает, что устройство stdin для функций может быть переопределено (перенаправление stdin) (как в Пример 3-1).
Пример 22-7. Настоящее имя пользователя
Ниже приводится альтернативный, и возможно менее запутанный, способ перенаправления ввода для функций. Он заключается в использовании перенаправления ввода для блока кода, заключенного в фигурные скобки, в пределах функции.
Примечания
Механизм косвенных ссылок на переменные (см. Пример 34-2) слишком неудобен для передачи аргументов по ссылке.
Команда return — это встроенная команда Bash.
Источник
Bash Функции
Bash Functions
В этом руководстве мы рассмотрим основы функций Bash и покажем, как их использовать в сценариях оболочки.
Функция Bash — это, по сути, набор команд, которые можно вызывать множество раз. Цель функции — помочь вам сделать ваши bash-скрипты более читабельными и избежать повторного написания одного и того же кода. По сравнению с большинством языков программирования, функции Bash несколько ограничены.
Определение функций Bash
Синтаксис объявления функции bash прост. Функции могут быть объявлены в двух разных форматах:
Первый формат начинается с имени функции, за которым следуют скобки. Это предпочтительный и более используемый формат.
Второй формат начинается с зарезервированного слова function , за которым следует имя функции.
Несколько моментов, которые следует отметить:
Команды между фигурными скобками ( <> ) называются телом функции. Фигурные скобки должны быть отделены от тела пробелами или переводами строки.
Определение функции не выполняет ее. Чтобы вызвать функцию bash, просто используйте имя функции. Команды между фигурными скобками выполняются всякий раз, когда функция вызывается в сценарии оболочки.
Определение функции должно быть помещено перед любыми вызовами функции.
При использовании однострочных «уплотненных» функций точка с запятой ; должна следовать за последней командой в функции.
Всегда старайтесь, чтобы имена ваших функций были описательными.
Чтобы лучше это понять, взглянем на следующий пример:
Давайте проанализируем код построчно:
В строке 3 мы определяем функцию, присваивая ей имя. Фигурная скобка < отмечает начало тела функции.
Линия 4 — это тело функции. Тело функции может содержать несколько команд, операторов и объявлений переменных.
Линия 5 , закрывающая фигурная скобка > , определяет конец hello_world функции.
В строке 7 мы выполняем функцию. Вы можете выполнять функцию столько раз, сколько вам нужно.
Если вы запустите скрипт, он напечатает hello, world .
Область действия переменных
Глобальные переменные — это переменные, к которым можно получить доступ из любого места в скрипте независимо от области видимости. В Bash все переменные по умолчанию определены как глобальные, даже если они объявлены внутри функции.
Локальные переменные могут быть объявлены в теле функции с local ключевым словом и могут использоваться только внутри этой функции. Вы можете иметь локальные переменные с одинаковыми именами в разных функциях.
Чтобы лучше проиллюстрировать, как работает область видимости переменных в Bash, давайте рассмотрим этот пример:
Сценарий начинается с определения двух глобальных переменных var1 и var2 . Затем есть функция, которая устанавливает локальную переменную var1 и изменяет глобальную переменную var2 .
Если вы запустите скрипт, вы должны увидеть следующий вывод:
Из приведенного выше вывода можно сделать вывод, что:
Когда локальная переменная устанавливается внутри тела функции с тем же именем, что и существующая глобальная переменная, она будет иметь приоритет над глобальной переменной.
Глобальные переменные могут быть изменены внутри функции.
Возвращаемые значения
В отличие от функций в «реальных» языках программирования, функции Bash не позволяют вам возвращать значение при вызове. Когда функция bash завершает свою работу, ее возвращаемое значение является состоянием последнего оператора, выполненного в функции, 0 для успеха и ненулевого десятичного числа в диапазоне 1 — 255 для отказа.
Статус возврата можно указать с помощью return ключевого слова, и оно присваивается переменной $? . return Оператор завершает функцию. Вы можете думать об этом как о состоянии выхода из функции .
Чтобы на самом деле вернуть произвольное значение из функции, нам нужно использовать другие методы. Самый простой вариант — присвоить результат функции глобальной переменной:
Другой, лучший вариант для возврата значения из функции отправить значение с stdout помощью эха или , printf как показано ниже:
Вместо того, чтобы просто выполнять функцию, которая будет печатать сообщение на стандартный вывод, мы назначаем вывод функции func_result переменной, используя $() подстановку команд. Переменная может позже использоваться по мере необходимости.
Передача аргументов в функции Bash
Чтобы передать любое количество аргументов функции bash, просто поместите их сразу после имени функции, разделив их пробелом. Хорошей практикой является двойная кавычка аргументов, чтобы избежать неправильного разбора аргумента с пробелами в нем.
Передаваемые параметры $1 , $2 , $3 . $n , соответствующее положению параметра после имени функции.
$0 Переменная зарезервирована для имени функции.
$# Переменная содержит число позиционных параметров / аргументов , передаваемых функции.
$* И $@ переменные содержат все позиционные параметры / аргументы , переданные функции.
При двойных кавычках «$*» раскрывается в одну строку, разделенную пробелом (первый символ IFS) — «$1 $2 $n» .
При двойных кавычках «$@» расширяется до отдельных строк — «$1» «$2» «$n» .
Когда не двойные кавычки, $* а $@ одинаковые.
Вывод
Функция Bash — это блок многократно используемого кода, предназначенный для выполнения определенной операции. После определения функция может вызываться несколько раз в скрипте.
Вы также можете прочитать о том, как использовать функцию Bash для создания запоминающейся команды быстрого доступа для более длинной команды.
Источник
Функции Bash
По сути, функция Bash — это набор команд, которые можно вызывать много раз. Назначение функции — помочь вам сделать ваши сценарии bash более удобочитаемыми и избежать повторного написания одного и того же кода. По сравнению с большинством языков программирования функции Bash несколько ограничены.
В этом руководстве мы рассмотрим основы функций Bash и покажем вам, как использовать их в сценариях оболочки.
Определение функций Bash
Синтаксис объявления функции bash прост. Функции могут быть объявлены в двух разных форматах:
Первый формат начинается с имени функции, за которым следуют круглые скобки. Это предпочтительный и более используемый формат.
Второй формат начинается с зарезервированного слова function , за которым следует имя функции.
Следует отметить несколько моментов:
Команды, заключенные в фигурные скобки ( <> ), называются телом функции. Фигурные скобки должны быть отделены от тела пробелами или символами новой строки.
Определение функции не выполняет ее. Чтобы вызвать функцию bash, просто используйте имя функции. Команды, заключенные в фигурные скобки, выполняются всякий раз, когда функция вызывается в сценарии оболочки.
Определение функции должно быть размещено перед любыми вызовами функции.
При использовании однострочных «уплотненных» функций точка с запятой ; должен следовать за последней командой в функции.
Всегда старайтесь, чтобы имена ваших функций были описательными.
Чтобы лучше понять это, взгляните на следующий пример:
Давайте проанализируем код построчно:
В строке 3 мы определяем функцию, давая ей имя. Фигурная скобка < отмечает начало тела функции.
Строка 4 — это тело функции. Тело функции может содержать несколько команд, операторов и объявлений переменных.
Строка 5 , закрывающая фигурная скобка > , определяет конец функции hello_world .
В строке 7 мы выполняем функцию. Вы можете выполнять функцию сколько угодно раз.
Если вы запустите сценарий, он напечатает hello, world .
Объем переменных
Глобальные переменные — это переменные, к которым можно получить доступ из любого места сценария независимо от области действия. В Bash все переменные по умолчанию определены как глобальные, даже если они объявлены внутри функции.
Локальные переменные могут быть объявлены в теле функции с помощью ключевого слова local и могут использоваться только внутри этой функции. У вас могут быть локальные переменные с одинаковыми именами в разных функциях.
Чтобы лучше проиллюстрировать, как работает область видимости переменных в Bash, давайте рассмотрим этот пример:
Сценарий начинается с определения двух глобальных переменных var1 и var2 . Затем есть функция, которая устанавливает локальную переменную var1 и изменяет глобальную переменную var2 .
Если вы запустите сценарий, вы должны увидеть следующий результат:
Из вышеприведенного вывода мы можем сделать вывод, что:
Когда локальная переменная установлена внутри тела функции с тем же именем, что и существующая глобальная переменная, она будет иметь приоритет над глобальной переменной.
Глобальные переменные можно изменить внутри функции.
Возвращаемые значения
В отличие от функций в «реальных» языках программирования, функции Bash не позволяют вам возвращать значение при вызове. Когда функция bash завершается, ее возвращаемое значение — это состояние последнего оператора, выполненного в функции, 0 для успеха и ненулевое десятичное число в диапазоне 1-255 для сбоя.
Статус возврата можно указать с помощью ключевого слова return , и он присваивается переменной $? . Оператор return завершает функцию. Вы можете думать об этом как о статусе выхода из функции.
Чтобы действительно вернуть произвольное значение из функции, нам нужно использовать другие методы. Самый простой вариант — присвоить результат функции глобальной переменной:
Другой, лучший вариант возврата значения из функции — это отправить значение в стандартный stdout с помощью echo или printf как показано ниже:
Вместо того чтобы просто выполнять функцию, которая выводит сообщение на стандартный вывод, мы назначаем вывод func_result переменной func_result с помощью func_result команды $() . В дальнейшем эту переменную можно будет использовать по мере необходимости.
Передача аргументов в функции Bash
Чтобы передать любое количество аргументов функции bash, просто поместите их сразу после имени функции, разделив пробелом. Рекомендуется заключать аргументы в двойные кавычки, чтобы избежать неправильного разбора аргумента с пробелами.
Передаваемые параметры: $1 , $2 , $3 … $n , соответствующие позиции параметра после имени функции.
Переменная $0 зарезервирована для имени функции.
Переменная $# содержит количество позиционных параметров / аргументов, переданных функции.
Переменные $* и $@ содержат все позиционные параметры / аргументы, переданные функции.
В двойных кавычках «$*» заменяется одной строкой, разделенной пробелом (первый символ IFS) — «$1 $2 $n» .
В двойных кавычках «$@» заменяется на отдельные строки — «$1» «$2» «$n» .
Если не заключать в двойные кавычки, $* и $@ одинаковы.
Выводы
Функция Bash — это блок многократно используемого кода, предназначенный для выполнения определенной операции. После определения функцию можно вызывать в сценарии несколько раз.
Вы также можете прочитать о том, как использовать функцию Bash для создания запоминающейся команды быстрого доступа для более длинной команды.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.