Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
ГЛАВА 22
Создание экранного ввода
Когда речь идет об экранном вводе, или вводе данных, подразумевают ввод информации (в нашем случае с помощью клавиатуры), а затем — проверку достоверности введенных данных. Если данные удовлетворяют неким критериям, они сохраняются.
Существуют функции для проверки некоторых условий, например длины строки. Можно также проверить, состоит ли строка из чисел или символов. Эти функции применяются наравне с другими функциями, рассматриваемыми в данной книге.
В главе обсуждаются следующие темы:
• проверка достоверности вводимых данных;
• добавление, удаление, обновление записей и их просмотр;
• сценарии, выполняющие обновление файлов.
Материал главы может с первого взгляда показаться сложным. В этом случае советуем вначале просмотреть главу, а затем вернуться к ней позже. Реализация проверки вводимых данных требует довольно большого программного кода. Однако для выявления всех возможных ошибок код должен выполнять проверку на наличие наиболее вероятных ошибок.
Рассмотрим отдельные задачи, из которых складывается общая система по обновлению файлов, включающая такие функции, как добавление, удаление, обновление и просмотр записей. В результате создается система хранения актуальной информации О сотрудниках. Записи в файле DBFILE содержат следующие сведения:
Поле
Длина
Разрешен ввод следующей информации
Описание
Staff number
10
Числовая
Номер служащего по штатному расписанию
First name
20
Символьная
Имя служащего
Second name
20
Символьная
Фамилия служащего
Department
Accounts
Отдел, где работает служащий
IT
Services
Sales
Claims
Поля разделяются двоеточием (:). Например:
<Staff number>:<First name>:<Second name>:<Department>
Каждое задание представляет собой завершенный сценарий. Небольшие части кода дублируются в некоторых представленных ниже сценариях. И это не случайно, поскольку настоящая глава посвящена описанию системы обновления данных. Когда я впервые приступил к написанию сценариев, то обнаружил явный дефицит документации, написанной простым и понятным языком. Особенно недостает описаний совместного использования базы данных и системы по обновлению файлов.
Для связи различных заданий реальный сценарий должен иметь соответствующее меню или модуль. Чаще всего для этой цели используется оболочка функций, содержащихся в файле, совместно с каким-либо меню сценария. Каждый сценарий включает команду trap; благодаря ее использованию игнорируются сигналы 2, 3 и 15.
22.1. Добавление записей
При добавлении записи в файл выполняются следующие задачи:
1. Подтверждение вводимых данных.
2. Внесение записи в файл.
Сначала необходимо связать вместе некоторые функции. Тогда можно узнать, являются ли поля числовыми или символьными, а также уточнить их размеры. В этом и состоит подтверждение вводимых данных. Подтверждение данных осуществляется при добавлении записей, а также при их обновлении. К счастью, некоторые из' требуемых функций уже имеются в вашем арсенале.
Функция для проверки длины строки:
length_check
{
# length_check
# $1=строка, $2= длина строки не превышает этого значения
_STR=$1
_МАХ=$2
_LENGTH=`echo $_STR | awk '{print length ($0) }"`
if [ "$_LENGTH" -gt "$_MAX" ]; then
return 1 else
return 0 fi }
Функция, выполняющая проверку наличия в строке исключительно числовых данных:
a_number
• a_number
• $1=string {
_NUM=$1
_NUM=`echo $1 awk '{if($0~/[^0-9]/) print "1")'`
if [ "$_NUM" != "" ]
then
return 1
else
return 0
fi
}
Функция, позволяющая определить, состоит ли строжа исключительно из одних символов:
characters
#characters
#$1=string
{
_LETTERS_ONLY=$1
_LETTERS_ONLY=`echo $1|awk '{if($0~/[^a-zA-Z]/) print "l"}'`
if [ "$_LETTERS_ONLY" != "" ]
then
return 1 else
return 0 fi
}
При просмотре полей можно просто вызвать необходимую функцию и затем проверить коды возврата.
Чтобы сообщения находились на экране до тех пор, пока пользователь не нажмет на клавишу для их удаления, нужно воспользоваться командным приглашением. Следующая функция реализует командное приглашение read_a_char.
continue_promptYN {
# continue_prompt
echo -n "Hit any key to continue.."
DUMMY=`read_a_char`
}
Когда вводятся данные пользователя, содержащие номер служащего, нужно убедиться, что ранее подобная информация не вводилась. Поле должно быть уникальным. Существует несколько способов для выполнения этой задачи; в данном случае применяется команда grep. С помощью команды grep выполняется поиск номера служащего, который содержится в строке _CODE. Если утилита awk не возвращает какого-либо значения, то дублирующиеся значения отсутствуют и функция завершает выполнение с кодом возврата 0. Ниже приводится код этой функции. (Обратите внимание, что для нахождения точного соответствия в команде grep используется выражение "$_CODE\>". Двойные кавычки служат для сохранения значения переменной; при использовании одинарных кавычек ничего возвращаться не будет.)
check_duplicate {
#check_duplicate
#проверка дубликата номера служащего
_CODE=$1
MATCH="grep "$_CODE\>" $DBFILE"
echo $_CODE
if [ "$MATCH"="" ]; then
return 0 # нет дублирования
else
return 1 # дубликат найден
fi
}
Ниже приводится часть программного кода, выполняющая проверку номера
служащего. Функционирование этого программного кода объясняется дальше.
while : do
echo -n "Employee Staff Number :"
read NUM
# проверка вводимых данных
if [ "$NUM" != "" ]; then
if a_number $NUM; then
# номер OK
NUM_PASS=0
else
NUM_PASS=1
fi
if length_check $NUM 10; then
# длина OK
LEN_PASS=0
else
LEN_PASS=1
fi
# проверка наличия дубликатов…
if check_duplicate $NUM; then
# нет дубликатов
DUPLICATED=0
else
DUPLICATED=1
echo "Staff Number: There ls already an employee with this number"