#!/bin/sh
##################
记录当前脚本位置
Base_Dir=`pwd`
##################
#初始化索引变量,允许大小写字母数字
_Choss="[[:alnum:]]" #Supoort nunber/alphabet [0-9a-zA-Z]
##################
#是否允许返回上一层,0允许,1不允许
_Menu=0
##################
#菜单配置文件
CONFIG_FILE=XXXXXXXXXXXX/XXX
cd $Base_Dir
##################
#退出条件交给程序控制,这里不管了
while : ;do
#clear ##清屏并显示一堆横线
echo "---------------------------------------------------------------------------------"
########################
#显示一级菜单
grep -w "^$_Choss " CONFIG_FILE 1>2 2>/dev/null
if [ $? -eq 0 ];then
grep "^$_Choss* " CONFIG_FILE | awk '{printf "%-10s%-20s
",$1,$2}' ######允许每个条目中有其他数据
else
echo "Nothing to do,Please Input q Go Back !"
############################
#已经是最上层,不允许回退到上一层
_Menu=1 #You Can go no Futher
fi
echo "---------------------------------------------------------------------------------"
echo "Please Input Your choose: Exit:Q/q"
read opt
echo $opt | grep -i q 1>2 2>/dev/null
if [ $? -eq 0 ];then
##################
#不管输入大小写q,设置_opt为q
#因此,正常的菜单项选择中不能有q
_opt=q
else
############################
#判断输入是否合法,如果合法就设置_opt为1,非法设置为0
echo $opt | grep "[^[:alnum:]]" 1>2 2>/dev/null && _opt=1 || _opt=0
[ "$opt" = "" ] && _opt=1
fi
##判断是否允许退回上一层
[ $_Menu -eq 1 -a "$_opt" != "q" ] && echo "Input Error!" && continue #You May Go no where but Back
case $_opt in
###返回上一层
q) #Go Back
if [ `echo $_Choss | awk -F"-" '{print NF}'` -eq 1 ];then
#退无可退,脚本退出。
##程序唯一的出口
#当然,你要 Ctrl+C 退出,我也不管。
exit 0
else
#########
#去掉通配符前面的那个字符,而非最后一个
_Choss="$(echo $_Choss | sed s'/[[:alnum:]][[:alnum:]]*-[[:alnum:]]/[[:alnum:]]/')"
_Menu=0 #You May Go Futher
fi
;;
0)#
#################
#如果对应条目对应位置<99吧>有脚本,就执行拼接后的脚本
#否则,就在当前选择添加到索引值里,注意,非最后
_sh=`grep -w "^$(echo $_Choss|sed 's/-[[:alnum:]]//')-$opt " CONFIG_FILE|awk '{print $99}'`
if [ -f $Base_Dir/bin/$_sh ];then
sh $Base_Dir/bin/$_sh
continue
else
if [ `echo $_Choss | awk -F"-" '{print NF}'` -eq 1 ];then
##########
#如果是一级菜单,就直接添加
_Choss="$opt-[[:alnum:]]"
else
##########
#非一级菜单的处理
_Choss="$(echo $_Choss|sed 's/-[[:alnum:]]//')-$opt-[[:alnum:]]"
fi
fi
;;
1) #
echo "Input Error!"
;;
esac
done