Шрифт:
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" != "" ]
then
# присутствуют ошибки
return 1
else
# содержит только символы
return 0
fi }
name_error
# отображение сообщения об ошибке
{
echo " $@ contains errors, it must contain only letters"
}
while : do
echo -n "What ls your first name :"
read F_NAME
if char_name $F_NAME
then
# все OK, завершение выполнения break else
name_error $F_NAME fi done
while : do
echo -n "What ls your surname :"
read S_NAME
if char_narae $S_NAME
then
# все OK, завершение выполнения
break else
name_error $S_NAME
fi
done
Обратите внимание на то, что для обработки результатов ввода применяется цикл while. Благодаря этому на экране отображается запрос до тех пор, пока пользователь не укажет верное значение. После ввода нужного значения выполнение цикла прерывается. Конечно, при реализации работающего сценария пользователю предоставляется возможность прервать выполнение цикла. При этом также применяется соответствующее управление курсором, например при проверке наличия полей с нулевой длиной.
Ниже приведены результаты выполнения описанного сценария:
$ func2
What ls your first name: Davi2d
Davi2d contains errors, it must contain only letters
What ls your first name: David
What ls your surname: Tansley1
Tansley1 contains errors, it must contain only letters
What ls your surname: Tansley
Проблемы с конструкцией echo
В системах Linux, BSD или System V конструкция echo по–разному интерпретирует служебные символы. Создадим функцию, определяющую систему, в которой используется конструкция echo.
После того как была применена конструкция echo, командная строка может и далее отображаться на экране, ожидая ввода данных со стороны команды read.
Для реализации описанного поведения в системах Linux и BSD совместно с командой echo применяется опция -n. Ниже приводится пример конструкции echo LINUX (BSD), когда командная строка продолжает отображаться на экране до момента завершения сценария:
$ echo -n "Your паше :"
Your name : {{?}}
В System V в этом случае применяется параметр \с: