Перед использованием функций их необходимо объявить. Суть объявления заключается в том, что все функции должны быть размещены в начале кода сценария. Невозможно сослаться на функцию до тех пор, пока она не попадет в "поле зрения" интерпретатора команд. Для вызова функции требуется просто ввести ее имя. В предыдущем примере функция называлась "hello"; тело функции включало конструкцию echo, которая, в свою очередь, отображала текущую дату.
19.2. Использование функций в сценарии
После создания функции рассмотрим методы ее применения в сценарии.
$ pg fund
#!/bin/sh
# func1
hello ()
{
echo "Hello there today's date ls `date`"
)
echo "now going to the function hello"
hello
echo "back from the function"
При выполнении этого сценария получаются следующие результаты:
$ fund
now going to the function hello
Hello there today's date ls Sun Jun 6 10:46:59 GMT 2000
back from the function
В предыдущем примере функция была объявлена в начале сценария. Для обращения к функции просто вводится ее имя, которое: в данном случае звучит как "hello". После завершения выполнения функции управление возвращается следующей конструкции, которая размещена после вызова функции. В приведенном примере речь идет о конструкции echo "back from the function".
19.3. Передача параметров функции
Порядок передачи параметров функции аналогичен передаче параметров обычному сценарию. При этом используются специальные переменные $1, $2, … $9. При получении функцией переданных ей аргументов происходит замена аргументов, изначально переданных сценарию интерпретатора shell. В связи с этим неплохо было бы повторно присвоить значения переменным, получаемым функцией. В любом случае это стоит сделать, поскольку при наличии ошибок в функциях их можно будет легко обнаружить, воспользовавшись именами локальных переменных. Для вызывающих аргументов (переменных), находящихся Внутри функции, имя каждой переменной начинается с символа подчеркивания, например: _FILENAME или _filename.
19.4. Возврат значения функции
После естественного завершения выполнения функции либо в том случае, когда она завершается в результате выполнения какого‑либо условия, можно выбрать один из двух возможных вариантов:
1. Дождаться, пока функция естественным образом не завершится сама с последующей передачей управления той части сценария, кото*рая вызвала данную функцию.
2. Воспользоваться ключевым словом return, в результате чего будет осуществлена передача управления конструкции, которая расположена за оператором вызова функции. При этом может также указываться необязательный числовой параметр. Этот параметр принимает значение 0 в случае отсутствия ошибок и значение 1 — при наличии ошибок. Действие этого параметра аналогично действию кода завершения последней команды. При использовании ключевого слова return применяется следующий формат:
return | возвращает результат из функции, использует код завершения последней команды для проверки сосстояния |
return 0 | применяется при отсутствии ошибок |
return 1 | применяется при наличии ошибок |
19.5. Проверка значений, возвращаемых функцией
Для проверки значения, возвращаемого вызванной функцией, можно воспользоваться кодом завершения последней команды, размешенной непосредственно после функции, которая вызывается из сценария. Например:
check it ls_a directory $FILENAME
# вызов функции и проверка
if [ $?=0 ]
# применение кода завершения последней команды для тестирования
then
echo "All ls OK" else
echo "Something went wrong!"
fi
Лучшим методом является использование оператора if, с помощью которого осуществляется проверка возвращаемого значения (0 или 1). Встраивание вызова функции в структуру оператора if значительно улучшает читабельность программного кода. Например:
if check_it_is_a_directory $FILENAME; then
echo "All is OK"
# действия
else
echo "Something went wrong!"
# действия
fi
Если функцию планируется использовать для отображения результатов некоторой проверки, для фиксации результата применяется подстановка. Формат, используемый для выполнения подстановки при вызове функции, будет следующим:
имя_переменной=`имя_функции`
Выводимый результат функции имя_функции присваивается переменной имя_переменной.