Литмир - Электронная Библиотека

get_char()

(

#get_char

#сохранение текущих установок stty SAVEDSTTY=`stty -g`

stty cbreak

dd if=/dev/tty bs=1 count=1 2> /dev/null

stty -cbreak

# восстановление установок stty

stty $SAVEDSTTY

}

# отображение или сокрытие курсора

cursor ()

{

#cursor

#отображение/сокрытие курсора

_OPT=$1

case $_OPT in

on) echo '^[[?25h';;

off) echo '^[[?251';;

*) return 1;;

esac }

# проверка прав доступа пользователя

restrict ()

{

colour red_yellow

echo -e -n "\n\n\007Sorry you are not authorised to use this function"

colour black_green

}

user_level () {

# user level

# просмотр файла priv.user

while read LINE

do

case $LINE in

# игнорирование комментариев

\#*);;

*) echo $LINE >> $HOLD1 ;;

esac

done < $USER_LEVELS

FOUND=false

while read MENU_USER PRIV

do

if [ "$MENU_USER"="$USER" ]; then

FOUND=true

case $PRIV in

yes|YES)

return 0 ;;

no|NO)

return 1 ;;

esac

else

# соответствие не найдено, чтение следующей записи

continue

fi

done <$HOLD1

if [ "$FOUND"="false" ]; then

echo "Sorry $USER you have not been authorised to use this menu"

exit 1

fi

}

# вызывается, если пользователь выполняет выход из программы

my_exit()

{

#my_exit

#вызывается, если пользователь выбирает выход из сценария!

colour black_white

cursor on

rm *.$$

exit 0

}

tput init

# отображение на экране уровня доступа пользователя

if user_level; then

ACCESS="Access Mode ls High"

else

ACCES3="Access Mode ls Normal"

fi

tput init

while :

do

tput clear

colour black_green

cat < MAYDAY

$ACCESS

MAYDAY

colour black_cyan

echo -e -n "\tYour Choice [1,2,3,4,5,P, H,Q] >"

@ read CHOICE

CHOICE=`get_char`

case $CHOICE in

1) ls ;;

2) vi ;;

3) who ;;

if userlevel; then

ls -l |wc

else

restrict

fi ;;

5)

if userlevel; then

sort /etc/passwd

else

restrict

fi ;;

esac

echo -e -n "\tHit the return key to continue"

read DUMMY

done

Linux и UNIX: программирование в shell. Руководство разработчика - _3.jpg

Подобное меню можно вызвать с помощью команды exec (из файла profile). Пользователи не могут изменить эту последовательность действий. Такой подход распространен в случае с пользователями, работающими только с приложениями UNIX или Linux и не использующими возможности интерпретатора shell.

21.3. Заключение

Команда tput позволяет значительно улучшить контроль со стороны пользователей за выполнением сценариев. Применение цветов улучшает внешний вид меню. Будьте осторожны при использовании гаммы цветов; цвета могут быть привлекательны для вас, но не отвечать вкусам пользователя, вынужденного применять сценарий. Работа со сценариями значительно облегчается при использовании управляющих символов. Это особенно проявляется в случае, когда пользователи осуществляют ввод информации путем выбора назначенных клавиш.

ГЛАВА 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

}

Функция, позволяющая определить, состоит ли строжа исключительно из одних символов:

82
{"b":"273485","o":1}