Пример 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.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Глава 4 Простая

Из книги 3ds Max 2008 для дизайна интерьеров автора Семак Рита

Глава 4 Простая В этой главе рассматриваются модификаторы и составные объекты. Действие модификаторов направлено на изменение формы объекта, взаимодействие двух объектов приводит к созданию третьего – составного. Моделирование с использованием модификаторов и


Пример: простая программа с уведомлением

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Пример: простая программа с уведомлением Прежде чем углубляться в тонкости сигналов реального времени и потоков Posix, мы напишем простейшую программу, включающую отправку сигнала SI6USR1 при помещении сообщения в пустую очередь. Эта программа приведена в листинге 5.8, и мы


Пример: очереди сообщений Posix и функция select

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Пример: очереди сообщений Posix и функция select Дескриптор очереди сообщений (переменная типа mqd_t) не является «обычным» дескриптором и не может использоваться с функциями select и poll (глава 6 [24]). Тем не менее их можно использовать вместе с каналом и функцией mq_notify. (Аналогичный


Пример: функция приема сообщений в случае сокета

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Пример: функция приема сообщений в случае сокета Часто оказывается удобным отправлять и получать сообщения в виде единых блоков. Как было показано в главе 11, каналы позволяют это сделать. Однако в случае сокетов требуется создание заголовка, содержащего размер


Простая архитектура PKI

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Простая архитектура PKI Архитектура PKI может быть очень простой, если у пользователей - простые требования. В этом разделе рассматриваются два типа простой архитектуры: одиночный УЦ и списки доверия УЦ. Простая архитектура достаточна для связывания пользователей одного и


17.1.1. Простая разметка

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель


Простая функция хеширования для строк

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

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


Пример 22-2. Функция с аргументами

Из книги автора

Пример 22-2. Функция с аргументами #!/bin/bash# Функции и аргументыDEFAULT=default # Значение аргумента по-умолчанию.func2 () { if [ -z "$1" ] # Длина аргумента #1 равна нулю? then echo "-Аргумент #1 имеет нулевую длину.-" # Или аргумент не был передан функции. else echo


Пример A-3. rn: Очень простая утилита для переименования файлов

Из книги автора

Пример A-3. rn: Очень простая утилита для переименования файлов Этот сценарий является модификацией Пример 12-15.#! /bin/bash## Очень простая утилита для переименования файлов## Утилита "ren", автор Vladimir Lanin (lanin@csd2.nyu.edu),#+ выполняет эти же действия много лучше.ARGS=2E_BADARGS=65ONE=1 #


Пример: функция str_echo, использующая стандартный ввод-вывод

Из книги автора

Пример: функция str_echo, использующая стандартный ввод-вывод Сейчас мы модифицируем наш эхо-сервер TCP (см. листинг 5.2) для использования стандартного ввода-вывода вместо функций readline и writen. В листинге 14.6 представлена версия нашей функции str_echo, использующая стандартный


Пример: функция bind и доменный сокет Unix

Из книги автора

Пример: функция bind и доменный сокет Unix Программа, показанная в листинге 15.2, создает доменный сокет Unix, с помощью функции bind связывает с ним полное имя и затем вызывает функцию getsockname и выводит это полное имя.Листинг 15.2. Связывание полного имени с доменным сокетом


Пример: функция mcast_join

Из книги автора

Пример: функция mcast_join В листинге 21.1[1] показана первая часть функции mcast_join. Эта часть демонстрирует простоту интерфейса программирования, не зависящего от протокола.Листинг 21.1. Присоединение к группе: сокет IPv4//lib/mcast_join.c 1 #include "unp.h" 2 #include <net/if.h> 3 int 4 mcast_join(int sockfd, const SA *grp,


Пример: функция mcast_set_loop

Из книги автора

Пример: функция mcast_set_loop В листинге 21.4 показана наша функция mcast_set_loop.Поскольку аргументом является дескриптор сокета, а не структура адреса сокета, мы вызываем нашу функцию sockfd_to_family, чтобы получить семейство адресов сокета. Устанавливается соответствующий параметр