menu_x_y()
{ _Z=$1
_S=$2
_L=$3
case $_Z in
2|3) if [ $_S -gt 1 ]
then _S=‘expr $_S - 1’
else _S=$_L
fi ;;
1|4) if [ $_S -lt $_L ]
then _S=‘expr $_S 1’
else _S=1
fi;;
esac
return $_S
}
4. 计算菜单界面每个菜单栏下的菜单数目函数
通常情况下每个菜单标题下所包含的内容是不相同的,因而每个菜单栏下菜单的数目也是不相同的,需要对每个菜单栏下的菜单数目进行计算,参数$1表示选择光标在菜单栏下的列位置。
menu_row_number()
{ _H=$1
S_NUMBER=‘cut -d“|” -f$_H menu|sed -e ‘s/ //g’-e ‘/^$/d’|\ awk ‘END { print NR}’’
}
5. 执行子程式函数
子程式名存在prg文档中,表2中的元素就是子程式名。调用子程式的过程实际就是根据选择光标在菜单界面的行列位置将相应位置的元素读出来,然后依据表2所提供的程式名判断是否真实存在,假如存在则执行。
menu_prg()
{ _C=$1 # 选择光标在菜单界面的列位置
_R=$2 # 选择光标在菜单界面的行位置
prg_name=‘awk -F“|” “NR==$_R { print }” prg|cut -d“|” -f$_C’
if [ -s $prg_name ]
then
eval $prg_name
# 执行所调用的子程式
else
echo “\007”
fi
}
下面是主程式:
# 配置菜单界面前景和背景颜色
COLOR1=“\033[32;44;1m” # 菜单界面的前景色
COLOR2=“\033[33;45;1m” # 菜单界面的背景色
COLOR3=“\033[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 “\033[${row};${C_COL}H┏\c”; menu_x “━”; echo “┓” ;;
3) echo “\033[${row};${C_COL}H┃\c”;
head -1 menu |sed -e ‘s/|//g’ |awk ‘{ print $0 “┃” }’;;
23) echo “\033[${row};${C_COL}H┗\c”; menu_x “━”; echo “┛\c” ;;
*) echo “\033[${row};${C_COL}H┃\c”; menu_x “ ”; echo “┃” ;;
esac
row=‘expr $row 1’
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 $row 1 ’
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 “\007”;;
esac
done
;;
*) echo “\007\c”;;
esac
done
小结
本文所论述的是如何在Unix系统下利用shell制作通用的下拉菜单。这种通用性集中体现在实现了菜单下的菜单名称连同所调用的子程式名称和菜单主程式的分离,菜单界面下子菜单名称连同所调用的子程式名称分别存放在两个文本文档中,主程式通过对这两个文档的读取实现了菜单程式的正确显示和选择功能。只要对这两个文本文档进行编辑,无需对主程式进行任何改变,即可完成Unix系统下拉菜单的制作,使得菜单制作很快捷、灵活。同时能够很方便地进行移植,因而有较强的通用性。而且采用这种方式制作出来的下拉菜单界面比较直观、明了,操作起来更加简单、方便。
备注:在编辑menu和prg文档时,子菜单名称和子程式名称是一一对应的关系,所以子菜单和子程式在文档中位置要摆放正确,不能乱放。由于在本程式中awk语句的任何分隔符都是“|”,而不是空格,因而文本文档中的分隔符也是“|”,而不能用空格,这一点在编辑这两个文档时要特别注意。
[/color:52cb699fa2]
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



