Шрифт:
Многие из функций выполняют обычные задачи. Они не предназначены для осуществления "прорыва" в деле создания сценариев, а просто экономят ваше время, позволяя не вводить одинаковые фрагменты кода. Только благодаря этому использование функций, несомненно, полезно.
В начале главы было рассмотрено, каким образом функции могут применяться в интерпретаторе shell. При первом знакомстве с применением функций говорилось о значениях, возвращаемых функциями.
В приведенных примерах функций использовались различные методы для вызова и проверки результатов, возвращаемых функциями. Поэтому, если у вас возникают какие-либо проблемы в этой области, просмотрите еще раз примеры и вспомните, каким образом функции возвращают и проверяют значения.
Вам может пригодиться следующий совет. Выполняя тестирование функции,, проверяйте ее действия в виде сценария, а, лишь получив удовлетворительные результаты, оформляйте сценарий в виде функции. При этом вы сэкономите время, затрачиваемое на проверку.
19.11. Вызов функций
В завершение этой главы рассмотрим два различных способа работы с функциями: вызов функций из исходного файла и применение функций, размещенных в сценариях.
19.11.1. Вызов функций, размещенных в сценариях
Чтобы использовать функцию в сценарии, ее нужно создать, затем убедиться в том, что конструкция, вызывающая эту функцию, находится после программного кода самой функции. Ниже приводится сценарий, из которого вызываются две функции. Сценарий уже рассматривался ранее; здесь осуществляется проверка существования каталога.
$ pg direc_check
#!/bin/sh
# файл функций
is_it_a_directory
{
#is_it_a_directory(
#вызов: is_it_a_directory имя_каталога
_DIRECTORY_NAME=$1
if [ $# -lt 1 ]; then
echo "is_it_a_directory: I need a directory name to check"
return 1
fi
# это каталог?
if [ ! —d $_DIRECTORY_NAME ]; then
return 1
else
return 0
fi
}
#
error_msg
{
#error_msg
#сигнал; сообщение; повторный сигнал
echo -e "\007"
echo $@
echo -e "\007"
return 0
}
### END OF FUNCTIONS
echo -n "enter destination directory :"
read DIREC
if is_it_a_directory $DIREC
then :
else
error_msg "$DIREC does not exist…creating it now"
mkdir $DIREC > /dev/null 2>&1
if [ $? != 0 ]
then
error_msg "Could not create directory: check it out!"
exit 1
else :
fi
fi # не каталог
echo "extracting files…"
В верхней части данного сценария определены две функции. Вызов этих функций осуществляется из основной части сценария. Все функции должны быть помещены в верхней части сценария перед началом основных блоков. Обратите внимание, что в качестве конструкции, отображающей сообщение об ошибке, используется функция error_msg. Все аргументы, переданные функции error_msg, просто отображаются на экране. При этом раздаются два звуковых сигнала.
19.11.2. Вызов функций из файла функций
Мы уже рассматривали, каким образом функции вызываются из командной строки. Эти типы функций обычно используются утилитами, создающими системные сообщения.
А теперь воспользуемся снова описанной выше функцией, но в этом случае поместим ее в файле функций. Назовем этот файл functions.sh, где "sh" означает "shell scripts" (сценарии интерпретатора shell).
$ pg functions.sh
#!/bin/sh
#functions.sh
#основные функции
is_it_a_directory (
#is_it_a_directory
#вызов: is_it_a_directory имя_каталога #
if [ $# -lt 1 ]; then
echo "is_it_a_directory: I need a directory name to check"
return 1
fi
# это каталог ?
DIRECTORY_NAME=$1
if [ !
– d $DIRECTORY_NAME ]; then
return 1 else
return D fi )
error_msg
{
echo -e "\007"
echo $@
echo -e "\007"
return 0
}
Создадим сценарий, вызывающий функции из файла functions.sh. Затем эти функции могут использоваться для выполнения каких-либо задач. Обратите внимание, что файл функций загружается с помощью следующего формата команд: