Если в процессе выполнения цикла while устанавливается искомое соответствие, переменной found присваивается значение "истина". Затем с помощью конструкции case выбираются права доступа. При этом возвращается 1 для обычных прав доступа либо 0 — для расширенных прав доступа.
Когда пользователь приступает к внесению изменений в запись или к удалению записи, выполняется проверка. Этот процесс основывается на коде возврата функции, описанном выше. В приведенном сценарии либо выполняется сортировка файла passwd, либо отображается каталог:
if user_level; then
sort /etc/passwd
else
restrict
fi
Функция restrict просто выводит на экран сообщение о нарушении прав доступа.
Вышеприведенная проверка может быть реализована за один цикл. Однако кодирование выглядит более привлекательно, если применяется метод работы с двумя файлами. В результате значительно облегчается отладка кода.
Чтобы выйти из меню, пользователь выбирает пункт q или Q, в результате чего вызывается функция для очистки экрана. Когда пользователь завершает работу с любым обширным сценарием, очень удобно в этом случае воспользоваться функцией. Это позволяет увеличить количество команд, выполняемых пользователем при завершении работы. Кроме того, значительно улучшается читабельность кода.
Ниже приводится соответствующий сценарий.
$ pg menu2
#!/bin/sh
#menu2
#СЦЕНАРИЙ ГЛАВНОГО МЕНЮ
#игнорирование CTRL‑C и прерывания QUIT
trap "" 2 3 15
MYDATE=`date +%d/%m/%Y`
THIS_HOST=`hostname -s`
USER=`whoami`
#файл, описывающий права доступа пользователя USER_LEVELS=priv.user
#файл для хранения
HOLDl=holdl.$$
#функция задания цвета
colour ()
{
# формат цвет_фона; цвет_переднего_планаm
case $1 in
black_green)
echo '^[[40;32m' ;;
black yellow)
echo '^[[40;33m' ;;
black_white)
echo '^[[40;37m' ;;
Ьlаск_суап)
echo '^[[40;36m' ;;
red_yellow)
echo '^[[41;33m' ;;
esac
}
# чтение значения клавиши
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