三种生成菜单的方式,C编写的菜单解析程序、dialog工具、select语法。前两种方式是基于curses库的实现,可以处理光标移动,第三种方式由ksh或bash所提供的select菜单方式实现,不支持光标移动。
由select语法编写的菜单程序:
#!/usr/bin/ksh
#确认完成返回
confirm_over()
{
echo "按
确认完成\c"
read
}
#确认是否继续
confirm_ok()
{
echo "按
确认执行\c"
read
if [ "$REPLY" = "y" ];then
return 0
else
return 1
fi
}
#参数是否都为数字
is_numbers()
{
echo "$1"|grep "^[0-9][0-9]*$" >/dev/null
}
#选中退出选项
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
执行批前备份
执行日终程序
查询日终日志
查看系统状态
退出菜单
EOF
#定义菜单的响应程序
set -A menu_acts f1 f2 f3 f4 f0
if [ `wc -l<$MENU_FILE` -ne $((${#menu_acts[*]})) ]
then
echo "请检查菜单条目和响应程序是否一致!"
exit 1
fi
#菜单项数量
item_num=`wc -l<$MENU_FILE|sed 's/ //g'`
#提示词
PS3="请输入选择项[1-$item_num]:"
#为了提高速度,放在内存里
menu_item=`cat menu.txt`
while true
do
clear
select choice in $menu_item
do
if is_numbers $REPLY && [ $REPLY -ge 1 ] && [ $REPLY -le $item_num ]
then
#将菜单编号转换为从0开始
m_i=$((REPLY-1))
${menu_acts[$m_i]}
break
fi
done
done
菜单效果如下: