Перед использованием функций их необходимо объявить. Суть объявления заключается в том, что все функции должны быть размещены в начале кода сценария. Невозможно сослаться на функцию до тех пор, пока она не попадет в "поле зрения" интерпретатора команд. Для вызова функции требуется просто ввести ее имя. В предыдущем примере функция называлась "hello"; тело функции включало конструкцию echo, которая, в свою очередь, отображала текущую дату.

<p><strong>19.2. Использование функций в сценарии</strong></p>

После создания функции рассмотрим методы ее применения в сценарии.

$ 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".

<p><strong>19.3. Передача параметров функции</strong></p>

Порядок передачи параметров функции аналогичен передаче параметров обычному сценарию. При этом используются специальные переменные $1, $2, … $9. При получении функцией переданных ей аргументов происходит замена аргументов, изначально переданных сценарию интерпретатора shell. В связи с этим неплохо было бы повторно присвоить значения переменным, получаемым функцией. В любом случае это стоит сделать, поскольку при наличии ошибок в функциях их можно будет легко обнаружить, воспользовавшись именами локальных переменных. Для вызывающих аргументов (переменных), находящихся Внутри функции, имя каждой переменной начинается с символа подчеркивания, например: _FILENAME или _filename.

<p><strong>19.4. Возврат значения функции</strong></p>

После естественного завершения выполнения функции либо в том случае, когда она завершается в результате выполнения какого‑либо условия, можно выбрать один из двух возможных вариантов:

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

   2. Воспользоваться ключевым словом return, в результате чего будет осуществлена передача управления конструкции, которая расположена за оператором вызова функции. При этом может также указываться необязательный числовой параметр. Этот параметр принимает значение 0 в случае отсутствия ошибок и значение 1 — при наличии ошибок. Действие этого параметра аналогично действию кода завершения последней команды. При использовании ключевого слова return применяется следующий формат:

returnвозвращает результат из функции, использует код завершения последней команды для проверки сосстояния
return 0применяется при отсутствии ошибок
return 1применяется при наличии ошибок
<p><strong>19.5. Проверка значений, возвращаемых функцией</strong></p>

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

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

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

имя_переменной=`имя_функции`

Выводимый результат функции имя_функции присваивается переменной имя_переменной.

Перейти на страницу:

Похожие книги