$ pg functions.main
#!/bin/sh findit ()
{
# findit
#if [ $# -lt 1 3; then
echo "usage: findit file"
return 1 fi
for loop do
find / -name $LOOP -print done }
Снова загрузим исходный файл:
$ . ./functions.main
Используйте команду set, чтобы убедиться, что файл действительно загружен. Если интерпретатор shell корректно интерпретирует цикл for и воспринимает все требуемые параметры, на экране отобразится соответствующее сообщение.
$ set
findit=()
{
if [ $# -lt 1 ]; then
echo "usage :`basename $0` file";
return 1; fi;
for loop in "$@"; do
find / -name $LOOP -print; done }
Далее вызывается измененная функция findit. При этом поддерживаются два файла с целью осуществления поиска:
$ findit LPSO.doc passwd
/usr/local/accounts/LPSO.doc
/etc/passwd
Теперь, когда вы получили начальные сведения о функциях, рассмотрим их практическое применение.
Сразу же стоит заметить, что использование функций позволяет сэкономить массу времени и усилий программистов. Это возможно благодаря тому, что функция является повторно применяемой.
Подтверждение ввода
Рассмотрим небольшой сценарий, который запрашивает имя и фамилию пользователя:
$ pg func2
#!/bin/sh
# func2
echo -n "What ls your first name :"
read F_NAME
echo -n "What ls your surname:"
read S_NAME
Данный сценарий предназначен для выполнения проверки значений переменных (переменным присваиваются исключительно одни символы). Выполнение этой задачи без применения функций может привести к дублированию программного кода. Функции позволяют обойтись без дублирования. Для проверки наличия одних лишь символов можно воспользоваться утилитой awk. Ниже приводится функция, которая осуществляет проверку ввода либо только прописных, либо строчных символов.
char_name()
{
#char_name
#вызов: char_name string
#назначение аргумента новой переменной
_LETTERS_ONLY=$1
#использование awk для проверки на наличие символов!
_LETTERS_ONLY=`echo $1 | awk '{if [$0~/[^a‑zA‑Z]/} print "1"}'`
if [ "$_LETTERS_ONLY" != "" ] then
# ошибки
return 1
else
# содержит только символы
return 0
fi }
Сначала переменной $1 будет присвоено более осмысленное имя. Затем применяется утилита awk, осуществляющая проверку, состоит ли переданная строка из одних литер. В результате выполнения возвращается код, включающий 1 (для символов, не являющихся литерами) и 0 — для символов–литер. Этот код присваивается переменной _LETTERS_ONLY.
Затем выполняется проверка значения переменной. Если переменной присвоено какое‑либо значение, то это свидетельствует о наличии ошибки; в случае отсутствия присвоенного значения ошибки нет. На основании результатов этой проверки формируется код возврата. Использование кода возврата позволяет сценарию фиксировать момент завершения проверки, выполняемой функцией в вызывающей части сценария.
Для проверки вывода функции можно использовать формат, применяемый для оператора if:
if char_name $F_NAME; then
echo "OK"
else
echo "ERRORS"
fi
Если происходит ошибка, можно создать другую функцию, отображающую сообщение об ошибке:
name_error ()
# name_error
# отображение сообщения об ошибке
{
echo " $@ contains errors, it must contain only letters"
}
Функция name_error будет отображать сообщения об ошибках, игнорируя при этом все некорректные записи. Применение специальной переменной $@ позволяет отображать на экране значения всех аргументов. В рассматриваемом случае будет отображено либо значение f_name, либо значение $NAME. А теперь приведем завершенный сценарий, созданный с применением функций:
$ pg func2
#!/bin/sh
char_r.ame {)
# наименование_символа
# вызов: char_name строка
# проверка на предмет того, действительно ли $1 содержит только символы a‑z.,A‑Z
{
# присвоение аргумента новой переменной
_LETTERS_ONLY=$1
_:LETTERS_ONLY=`echo $1|awk '{ if ($0~/[^a‑zA‑Z]/) print "1"}`
if [ "$_LETTERS_ONLY" != "" ]