Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 11: Функции Вперед

Введение

Что такое функции?

Функции командной оболочки являются способом группирования команд, которые затем можно выполнить, указав одно имя, присвоенное всей группе или последовательности команд (routine). Имя последовательности команд должно быть уникальным в командной оболочке или в скрипте. Все команды, составляющие функцию, выполняются как обычные команды. Когда происходит обращение к функции, как к простому имени команды, будет выполнен список команд, ассоциированный с этим именем функции. Функция выполняется внутри командной оболочки, в которой она была объявлена; при интерпретации этих команд новый процесс не создается.

При поиске команд сначала ищутся специальные встроенные команды, а затем — функции командной оболочки. Специальными встроенными командами являются следующие: break, :, ., continue, eval, exec, exit, export, readonly, return, set, shift, trap и unset.

Синтаксис функций

Синтаксис объявления функций следующий

function FUNCTION { COMMANDS; }

или

FUNCTION () { COMMANDS; }

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

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

Обычные ошибки

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

Тело функции должно заканчиваться точкой с запятой или символом новой строки.

Позиционные параметры в функциях

Функции напоминают мини-скрипты: у них могут быть параметры, в них можно пользоваться переменными, известными только внутри функции (с помощью встроенной команды local), и они могут возвращать значения в вызывающую оболочку.

В функции также есть система интерпретации позиционных параметров. Однако, позиционные параметры передаются в функцию не так, как они передаются в команду или скрипт.

Когда выполняется функция, аргументы функции во время ее исполнения становятся позиционными параметрами. Чтобы отразить эти изменение, изменяется специальный параметр #, в котором указывается количество позиционных параметров. Позиционный параметр 0 остается без изменений. Имя исполняемой функции запоминается в переменной FUNCNAME, имеющейся в Bash.

Если в функции выполняется встроенная команда return, функция завершается и выполнение возобновляется со следующей команды после вызова функции. Когда функция завершается, значения позиционных параметров и специального параметра # будут восстановлены и в них будут находиться значения, которые в них были до выполнения функции. Если в команде return указан числовой аргумент, то он возвращается как код возврата. Простой пример:

[lydia@cointreau ~/test] cat showparams.sh
#!/bin/bash
                                                                                
echo "This script demonstrates function arguments."
echo
                                                                                
echo "Positional parameter 1 for the script is $1."
echo
                                                                                
test ()
{
echo "Positional parameter 1 in the function is $1."
RETURN_VALUE=$?
echo "The exit code of this function is $RETURN_VALUE."
}
                                                                                
test other_param

[lydia@cointreau ~/test] ./showparams.sh parameter1
This script demonstrates function arguments.
 
Positional parameter 1 for the script is parameter1.
 
Positional parameter 1 in the function is other_param.
The exit code of this function is 0.

[lydia@cointreau ~/test]

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

if [ $RETVAL -eq 0 ]; then
        <start the daemon>

Или, например, как в скрипте из /etc/init.d/amd, где используются возможности оптимизации, имеющиеся в Bash:

[ $RETVAL = 0 ] && touch /var/lock/subsys/amd

Команды, указанные после &&, выполняются только тогда, когда результатом проверки является истинное значение; это более краткий способ представления структуры if/then/fi.

Код возврата функции часто используется в качестве кода возврата всего скрипта. Вы обнаружите много скриптов init, оканчивающихся чем-то наподобие exit $RETVAL.

Отображение функций

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

[lydia@cointreau ~] which zless
zless is a function
zless ()
{
    zcat "$@" | "$PAGER"
}

[lydia@cointreau ~] echo $PAGER
less

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

Еще пример для пользователей DOS:

dir ()
{
    ls -F --color=auto -lF --color=always "$@" | less -r
}

Предыдущий раздел: Оглавление Следующий раздел:
Подводим итоги главы 8   Примеры функций в скриптах