三种生成菜单的方式,C编写的菜单解析程序、dialog工具、select语法。前两种方式是基于curses库的实现,可以处理光标移动,第三种方式由ksh或bash所提供的select菜单方式实现,不支持光标移动。
使用dialog工具编写的菜单程序:
#!/usr/bin/sh
confirm_over()
{
dialog --title "msgbox" --msgbox "执行完成!" 5 20
}
confirm_ok()
{
dialog --title "yesno" --no-shadow --yesno "要继续执行么?" 5 30
}
#返回11表示出错
#之所以不使用1作为错误返回,是因为菜单中选择cancel会返回1
#之所以不使用255作为错误返回,是因为菜单中按ESC键会返回255
build_dialog()
{
if [ ! -f "$1" ]
then
echo "菜单文件[$1]不存在!"
return 11
fi
if [ -z "$l_items" ]
then
item_i=0
set -A arr_items `cat $1`
item_num=${#arr_items[*]}
while [ $item_i -lt $item_num ]
do
tag="`echo ${arr_items[$item_i]}|cut -d '.' -f 1`"
item="`echo ${arr_items[$item_i]}|cut -d '.' -f 2`"
l_items="$l_items $tag $item"
item_i=$((item_i+1))
done
fi
dialog --title "日终执行菜单" --menu "选择其中一项" 20 40 $item_num $l_items
}
#选中退出选项
f0()
{
exit 0
}
#选中第一个菜单
f1()
{
clear
if confirm_ok ;then
#要执行的命令
:
clear
confirm_over
fi
}
#选中第二个菜单
f2()
{
clear
confirm_over
}
#选中第三个菜单
f3()
{
clear
confirm_over
}
#选中第四个菜单
f4()
{
clear
confirm_over
}
MENU_FILE=menu.txt
cat >$MENU_FILE <<-EOF
1.执行批前备份
2.执行日终程序
3.查询日终日志
4.查看系统状态
q.退出菜单
EOF
#菜单项个数
item_num=0
#单行的菜单项
l_items=
#多行的菜单项
arr_items=
#定义菜单的响应程序
set -A m_acts f1 f2 f3 f4 f0
if [ `wc -l<$MENU_FILE` -ne $((${#m_acts[*]})) ]
then
echo "请检查菜单条目和响应程序是否一致!"
exit 1
fi
while true
do
build_dialog $MENU_FILE 2>sel.txt
if [ $? -eq 11 ];then
echo "显示菜单出错!"
exit 1
fi
ans=`head -1 sel.txt`
item_i=0
while [ $item_i -lt $item_num ]
do
tag="`echo ${arr_items[$item_i]}|cut -d '.' -f 1`"
if [ "$tag" = "$ans" ]
then
${m_acts[$item_i]}
break
fi
item_i=$((item_i+1))
done
done
菜单效果如下: