SHELL菜单

SHELL菜单
2011年09月01日
   SHELL菜单的编写从此变得如此简单
  完善的流程控制
  简洁精美的界面
  将下面的代码分别存为3个文件: msh.etc, msh.fun, msh.sh
  执行msh.sh,看一下效果吧
  只要修改msh.etc和msh.fun文件,就可以生成自己的菜单了,不用再写程序了
  -------------------msh.etc------------------------ -----
  MAINMENU 超级SHELL主控菜单
  1 子菜单 submenu
  1-1 功能1 fun101 0
  1-2 当前日期 fun102 0 1-1
  2 功能函数2 fun2 1 1-1
  -------------------end---------------------------- ------
  -------------------msh.fun------------------------ ------
  fun101(){
  echo "团结就是力量!!"
  }
  fun102(){
  date
  }
  fun2(){
  echo "神仙?妖怪?"
  }
  -------------------end---------------------------- ----------
  -------------------msh.sh------------------------- ---------
  #!/bin/sh
  srcfile="./msh.etc"
  funfile="./msh.fun"
  etcfile="./.msh"
  currlevel="1"
  current=
  currmenu="0"
  choice=
  title=
  cmd=
  redoflg=
  dependflg=
  status=
  errmsg=
  blank=" "
  . $funfile
  __showmenu(){
  clear
  awk -v BLANK="$blank" '$1 ~ /^MAINMENU$/{printf "\n\n\n\n%s%s\n",BLANK,$2}' $srcfile
  printf " ----------------------------------\n"
  if [ $1 = "0" ]
  then
  expression="\$1 ~ /^.\$/"
  else
  expression="\$1 ~ /^$1-.\$/"
  fi
  awk -v BLANK="$blank" -v ETCFILE="$etcfile" -v MENUID="$1" \
  'BEGIN{\
  while ( getline tracelog > ETCFILE;
  }\
  }' $srcfile
  printf "${blank}q 退出\n"
  printf "请输入选择:"
  }
  __getfunc(){
  __i=0
  title=
  cmd=
  redoflg=
  dependflg=
  for __p in `awk '{ if ($1 ~ /^'"$current"'$/)print $0 }' $srcfile`
  do
  __i=`expr $__i + 1`
  if [ $__i -eq 2 ]
  then
  title=$__p
  elif [ $__i -eq 3 ]
  then
  cmd=$__p
  elif [ $__i -eq 4 ]
  then
  redoflg=$__p
  elif [ $__i -eq 5 ]
  then
  dependflg=$__p
  fi
  done
  }
  submenu(){
  currlevel=`expr $currlevel + 1`
  currmenu="$current"
  }
  __upmenu(){
  currlevel=`expr $currlevel - 1`
  if [ "$currlevel" = "1" ]
  then
  currmenu="0"
  else
  __len=`expr $currlevel \* 2 - 3`
  currmenu=`printf "%."$__len"s" $currmenu`
  fi
  }
  __getcmd(){
  read choice
  if [ "X$choice" = "Xq" ]
  then
  if [ "X$currlevel" = "X1" ]
  then
  cmd="QUIT"
  else
  cmd="__upmenu"
  fi
  else
  if [ "X$currlevel" = "X1" ]
  then
  current=$choice
  else
  __len=`expr $currlevel \* 2 - 3`
  current=`printf "%."$__len"s" $current`"-$choice"
  fi
  __getfunc
  fi
  }
  __cmdcheck(){
  if [ "X$cmd" = "Xsubmenu" -o "X$cmd" = "X__upmenu" ]
  then
  return 1
  fi
  __statuslist=`awk -v depend=$dependflg '{if ($1 == depend)print $2}' $etcfile`
  __status=`echo $__statuslist | awk '{print $NF}'`
  if [ ! "X$dependflg" = "X" -a ! "X$__status" = "X0" ]
  then
  errmsg=`echo "该步依赖于步骤[$dependflg],但此步未执行或执行失败"`
  return 0
  fi
  __statuslist=`awk -v current=$current '{if ($1 == current)print $2}' $etcfile`
  __status=`echo $__statuslist | awk '{print $NF}'`
  if [ "X$redoflg" = "X0" -a "X$__status" = "X0" ]
  then
  errmsg=`echo "该步不能重复执行"`
  return 0
  fi
  return 1
  }
  __exec(){
  if [ ! "X$cmd" = "X" ]
  then
  __cmdcheck
  if [ $? -eq 1 ]
  then
  $cmd
  status=$?
  if [ ! "X$cmd" = "Xsubmenu" -a ! "X$cmd" = "X__upmenu" ]
  then
  printf "%s %s %s\n" $current $status `date +%Y/%m/%d-%H:%M:%S` >> $etcfile
  echo "执行结束,按回车键返回"
  read __a
  fi
  else
  echo "$errmsg"
  read __a
  fi
  fi
  }
  if [ ! -f $etcfile ]
  then
  > $etcfile
  fi
  while true
  do
  __showmenu $currmenu
  __getcmd
  if [ "X$cmd" = "XQUIT" ]
  then
  printf "确定要退出吗(y/n)?"
  read __ok
  if [ "X$__ok" = "Xy" ]
  then
  break
  else
  continue
  fi
  elif [ "X$cmd" = "XE" ]
  then
  continue
  else
  __exec
  fi
  done
  rm -f $etcfile
  ------------------------end----------------------- -----------
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值