Пример 22-1. Простая функция

Пример 22-1. Простая функция

#!/bin/bash

funky ()

{

echo "Это обычная функция."

} # Функция должна быть объявлена раньше, чем ее можно будет использовать.

# Вызов функции.

funky

exit 0

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

f1

# Эта строка вызовет сообщение об ошибке, поскольку функция "f1" еще не определена.

declare -f f1 # Это не поможет.

f1 # По прежнему -- сообщение об ошибке.

# Однако...

f1 ()

{

echo "Вызов функции "f2" из функции "f1"."

f2

}

f2 ()

{

echo "Функция "f2"."

}

f1 # Функция "f2", фактически, не вызывается выше этой строки,

#+ хотя ссылка на нее встречается выше, до ее объявления.

# Это допускается.

# Спасибо S.C.

Допускается даже создание вложенных функций, хотя пользы от этого немного.

f1 ()

{

f2 () # вложенная

{

echo "Функция "f2", вложенная в "f1"."

}

}

f2 # Вызывает сообщение об ошибке.

# Даже "declare -f f2" не поможет.

echo

f1 # Ничего не происходит, простой вызов "f1", не означает автоматический вызов "f2".

f2 # Теперь все нормально, вызов "f2" не приводит к появлению ошибки,

#+ поскольку функция "f2" была определена в процессе вызова "f1".

# Спасибо S.C.

Объявление функции может размещаться в самых неожиданных местах.

ls -l | foo() { echo "foo"; } # Допустимо, но бесполезно.

if [ "$USER" = bozo ]

then

bozo_greet () # Объявление функции размещено в условном операторе.

{

echo "Привет, Bozo!"

}

fi

bozo_greet # Работает только у пользователя bozo, другие получат сообщение об ошибке.

# Нечто подобное можно использовать с определеной пользой для себя.

NO_EXIT=1 # Will enable function definition below.

[[ $NO_EXIT -eq 1 ]] && exit() { true; } # Определение функции в последовательности "И-список".

# Если $NO_EXIT равна 1, то объявляется "exit ()".

# Тем самым, функция "exit" подменяет встроенную команду "exit".

exit # Вызывается функция "exit ()", а не встроенная команда "exit".

# Спасибо S.C.