Linux bash функции с параметрами

Глава 22. Функции

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

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

Источник

Читайте также:  Прозрачные окна mac os
Оцените статью