在Unix系统下用shell制作通用界面( 三 )


if [ -s $prg_name ]
then
eval $prg_name
# 执行所调用的子程序
else
echo “07”
fi
}
下面是主程序:
# 设置菜单界面前景与背景颜色
COLOR1=“33[32;44;1m” # 菜单界面的前景色
COLOR2=“33[33;45;1m” # 菜单界面的背景色
COLOR3=“33[37;40;1m” # 选择光标的颜色
# 对程序中所用的一些变量进行初始化设置
CUR_R=1 #选择光标在菜单界面的行位置
CUR_C=1 #选择光标在菜单界面的列位置
S_LENGTH=‘head -1 menu|sed -e ‘s/|//g" |awk ‘{ print length($0)}""
# 确定菜单界面的宽度
S_MENU=‘head -1 menu|awk -F“|” ‘{ print NF}""
# 确定菜单标题栏的字段数
C_COL=‘expr ( 80 - $S_LENGTH - 4 ) / 2 " # 确定菜单界面的起始位置
echo ${COLOR1}; clear # 按格式显示菜单界面
row=2 # 显示行 [2-23]
while [ row -le 23 ]
do
case $row in
2) echo “33[${row};${C_COL}H┏c”; menu_x “━”; echo “┓”
3) echo “33[${row};${C_COL}H┃c”;
head -1 menu |sed -e ‘s/|//g" |awk ‘{ print $0 “┃” }"
23) echo “33[${row};${C_COL}H┗c”; menu_x “━”; echo “┛c”
*) echo “33[${row};${C_COL}H┃c”; menu_x “ ”; echo “┃”
esac
row=‘expr $row1"
done
while true
do
menu_c $CUR_C $CUR_R # 计算选择光标的位置
echo “${COLOR2}${SCREEN_CUR_X}c”
stty -echo
getchar # 等待选择
ANS_X=$? # 返回ASCII值
stty echo
echo “${COLOR1}${SCREEN_CUR_X}c”
case $ANS_X in
3|4) menu_x_y $ANS_X $CUR_C $S_MENU
#选择光标在菜单标题栏中左右移动
CUR_C=$?
1|10) if [ $CUR_C = $S_MENU ] #按回车键或↓键进入子菜单
then setcolor -n ; clear; break
fi
menu_row_number $CUR_C
# 在菜单标题栏下将所包含子菜单内容显示在屏幕上
row=2
while [ row -le ${S_NUMBER} ]
do
menu_c $CUR_C $row
echo “${COLOR3}${SCREEN_CUR_X}c”
row=‘expr $row1 "
done
while true do
menu_c $CUR_C $CUR_R
echo “${COLOR2}${SCREEN_CUR_X}c”
stty -echo
getchar
ANS_Y=$?
stty echo
echo “${COLOR3}${SCREEN_CUR_X}c”
case $ANS_Y in
1|2) menu_x_y $ANS_Y $CUR_R $S_NUMBER #上下移动选择光标
CUR_R=$?
3|4) menu_x_y $ANS_Y $CUR_C $S_MENU #左右移动选择光标退出子菜单选择
CUR_C=$?
CUR_R=1
break
10) menu_prg $CUR_C $CUR_R#回车后执行子程序
*) echo “07”
esac
done

*) echo “07c”
esac
done
小结
本文所论述的是如何在Unix系统下利用shell制作通用的下拉菜单 。这种通用性集中体现在实现了菜单下的菜单名称以及所调用的子程序名称与菜单主程序的分离,菜单界面下子菜单名称以及所调用的子程序名称分别存放在两个文本文件中,主程序通过对这两个文件的读取实现了菜单程序的正确显示与选择功能 。只要对这两个文本文件进行编辑,不需要对主程序进行任何改动,即可完成Unix系统下拉菜单的制作,使得菜单制作非常快捷、灵活 。同时可以很方便地进行移植,因而有较强的通用性 。而且采用这种方式制作出来的下拉菜单界面比较直观、明了,操作起来更加简单、方便 。
备注:在编辑menu和prg文件时,子菜单名称和子程序名称是一一对应的关系,所以子菜单与子程序在文件中位置要摆放正确,不能乱放 。由于在本程序中awk语句的所有分隔符都是“|”,而不是空格,因而文本文件中的分隔符也是“|”,而不能用空格,这一点在编辑这两个文件时要特别注意 。

推荐阅读