Использование функций делает сопровождение своих скриптов проще. Проще говоря, это хороший способ разделить программу на более мелкие куски. Функция выполняет определенное действие и может возвращать то значение, какое вы пожелаете. Прежде чем продолжать, я приведу пример скрипта, написанного с использованием функции:
>#!/bin/bash
># функция hello() печатает сообщение
>hello(){
>echo "Вы находитесь в функции hello()"
>}
>echo "Вызываем функцию hello()…"
>hello
Попробуйте запустить код из примера выше. Функция hello() в нем имеет только одно предназначение — просто напечатать сообщение. Но, конечно же, они могут решать и более сложные задачи. Выше мы вызвали функцию hello(), используя строку:
>hello
Когда запускается эта строка, bash ищет скрипт для строки hello(). Он находит его в начале файла и выполняет его содержимое. Функции всегда вызываются по своему имени, что мы и видели выше. При написании функции вы можете обьявить ее, просто указав имя_функции (), как это сделано выше, или если вы хотите сделать ее объявление более явным, можете объявить ее так: function имя_функции(). Ниже представлен альтернативный способ написания функции hello()
>function hello() {
>echo "Вы находитесь в функции hello()"
>}
После имени функции должны следовать пустые открывающая и закрывающая скобки: "()", за ними следует пара фигурных скобок: «{…}», содержащих тело функции. Другими словами, весь код функции заключен в эти фигурные скобки. Функции всегда должны быть предварительно объявлены до своего вызова. Давайте попробуем в приведенном выше примере вызвать функцию до ее объявления:
>#!/bin/bash
>echo "Вызов функции hello() …"
>hello
>echo "Вы вне функции hello()"
># функция hello() просто выводит сообщение
>hello(){
>echo "Вы находитесь в функции hello()"
>}
Вот что мы получим, когда попытаемся запустить этот скрипт:
>$ ./hello.sh
>Вызов функции hello() ...
>./hello.sh: hello: command not found
>Вы вне функции hello()
Как видите, мы получили сообщение об ошибке. Поэтому стоит всегда размещать ваши функции в начале кода или, по крайней мере, непосредственно перед вызовом функции.
Еще один пример использования функции:
>#!/bin/bash
># admin.sh – инструмент для администратора
># функция new_user () создает новую учетную запись пользователя
>new_user(){
>echo "Подготовка к созданию новых пользователей ..."
>sleep 2
># запускаем программу adduser adduser
>}
>echo "1. Добавить пользователя"
>echo "2. Выход"
>echo "Укажите, что вы хотите сделать:"
>read choice
>case $choice in
>1) new_user # вызов функции new_user()
>;;
>*) exit
>;;
>esac
Для того чтобы приведенный скрипт работал правильно, вам необходимо запустить его из-под пользователя root, т. к. иначе программа adduser не сможет создать новых пользователей. Надеюсь, этот пример (хоть он и краток) показывает положительный эффект от использования функций.
Вы можете использовать встроенную в bash программу trap для перехвата сигналов в своих программах. Это хороший способ изящно завершать работу программы. Например, если пользователь, когда ваша программа работает, нажмет CTRL-C — программе будет отправлен сигнал interrupt(SIGINT), который завершит ее. Функция trap позволит вам перехватить этот сигнал, что даст возможность либо продолжить выполнение программы, либо сообщить пользователю, что программа завершает работу. Синтаксис этой команды такой:
>trap action signal
Здесь: action — то, что вы хотите делать, когда сигнал получен; signal — сигнал, на который стоит реагировать.
Список сигналов можно посмотреть с помощью команды trap -l.
При указании сигналов в своих скриптах можно опустить первые три буквы названия сигнала, т. е. SIG. Например, сигнал прерывания это — SIGINT. В вашем скрипте, в качестве его имени, можно указать просто INT. Вы также можете использовать номер сигнала, указанный рядом с его именем. Например, числовое значение сигнала SIGINT — 2. Попробуйте написать и запустить приведенный ниже пример:
>#!/bin/bash
># использование команды trap
># перехватываем нажатие CTRL-C и запускаем функцию sorry()
>trap sorry INT
># функция sorry() печатает сообщение
>sorry(){