Учебники

Unix / Linux — Функции оболочки

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

Использование функций для выполнения повторяющихся задач является отличным способом создания повторного использования кода . Это важная часть современных принципов объектно-ориентированного программирования.

Функции оболочки аналогичны подпрограммам, процедурам и функциям в других языках программирования.

Создание функций

Чтобы объявить функцию, просто используйте следующий синтаксис —

function_name () { 
   list of commands
}

Имя вашей функции — имя_функции , и это то, что вы будете использовать для вызова ее из других мест в ваших скриптах. За именем функции должны следовать круглые скобки, за которыми следует список команд, заключенных в фигурные скобки.

пример

Следующий пример показывает использование функции —

Live Demo

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World"
}

# Invoke your function
Hello

После выполнения вы получите следующий вывод —

$./test.sh
Hello World

Передать параметры в функцию

Вы можете определить функцию, которая будет принимать параметры при вызове функции. Эти параметры будут представлены $ 1 , $ 2 и так далее.

Ниже приведен пример, в котором мы передаем два параметра Zara и Ali, а затем записываем и печатаем эти параметры в функции.

Live Demo

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
}

# Invoke your function
Hello Zara Ali

После выполнения вы получите следующий результат —

$./test.sh
Hello World Zara Ali

Возвращение значений из функций

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

Если вместо этого вы хотите просто прекратить выполнение функции, то есть способ выйти из определенной функции.

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

return code

Здесь код может быть любым, что вы выберете здесь, но, очевидно, вы должны выбрать что-то значимое или полезное в контексте вашего сценария в целом.

пример

Следующая функция возвращает значение 10 —

Live Demo

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
   return 10
}

# Invoke your function
Hello Zara Ali

# Capture value returnd by last command
ret=$?

echo "Return value is $ret"

После выполнения вы получите следующий результат —

$./test.sh
Hello World Zara Ali
Return value is 10

Вложенные функции

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

Следующий пример демонстрирует вложение двух функций —

Live Demo

#!/bin/sh

# Calling one function from another
number_one () {
   echo "This is the first function speaking..."
   number_two
}

number_two () {
   echo "This is now the second function speaking..."
}

# Calling function one.
number_one

После выполнения вы получите следующий результат —

This is the first function speaking...
This is now the second function speaking...

Вызов функции из подсказки

Вы можете поместить определения для часто используемых функций в ваш .profile . Эти определения будут доступны при каждом входе в систему, и вы сможете использовать их в командной строке.

Кроме того, вы можете сгруппировать определения в файле, скажем test.sh , а затем выполнить файл в текущей оболочке, набрав —

$. test.sh

Это приводит к тому, что функции, определенные в test.sh, читаются и определяются для текущей оболочки следующим образом:

$ number_one
This is the first function speaking...
This is now the second function speaking...
$

Чтобы удалить определение функции из оболочки, используйте команду unset с опцией .f . Эта команда также используется для удаления определения переменной в оболочке.