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