Unix / Linux - Функции оболочки
В этой главе мы подробно обсудим функции оболочки. Функции позволяют вам разбить общую функциональность сценария на более мелкие логические подразделы, которые затем могут быть вызваны для выполнения своих индивидуальных задач, когда это необходимо.
Использование функций для выполнения повторяющихся задач - отличный способ создать code reuse. Это важная часть современных принципов объектно-ориентированного программирования.
Функции оболочки похожи на подпрограммы, процедуры и функции в других языках программирования.
Создание функций
Чтобы объявить функцию, просто используйте следующий синтаксис -
function_name () {
list of commands
}
Имя вашей функции function_name, и это то, что вы будете использовать для его вызова из любого места в ваших скриптах. После имени функции должны быть круглые скобки, а затем список команд, заключенный в фигурные скобки.
пример
В следующем примере показано использование функции -
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World"
}
# Invoke your function
Hello
После выполнения вы получите следующий вывод -
$./test.sh
Hello World
Передача параметров функции
Вы можете определить функцию, которая будет принимать параметры при вызове функции. Эти параметры будут представлены как$1, $2 и так далее.
Ниже приведен пример, в котором мы передаем два параметра Зара и Али, а затем фиксируем и печатаем эти параметры в функции.
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
}
# Invoke your function
Hello Zara Ali
После выполнения вы получите следующий результат -
$./test.sh
Hello World Zara Ali
Возврат значений из функций
Если вы выполните exit команды изнутри функции, ее эффект заключается не только в завершении выполнения функции, но и программы оболочки, которая вызвала функцию.
Если вместо этого вы хотите просто прекратить выполнение функции, то есть способ выйти из определенной функции.
В зависимости от ситуации вы можете вернуть любое значение из своей функции, используя return команда, синтаксис которой следующий -
return code
Вот code здесь может быть что угодно, но очевидно, что вам следует выбрать что-то значимое или полезное в контексте вашего скрипта в целом.
пример
Следующая функция возвращает значение 10 -
#!/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
Вложенные функции
Одна из наиболее интересных особенностей функций заключается в том, что они могут вызывать сами себя, а также другие функции. Функция, которая вызывает сама себя, называетсяrecursive function.
Следующий пример демонстрирует вложение двух функций:
#!/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вариант. Эта команда также используется для удаления определения переменной в оболочке.
$ unset -f function_name