`
microjava
  • 浏览: 309373 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SHELL菜单

F# 
阅读更多
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 == 1 ){\
                        split(tracelog,menuid);\
                        idstatus[menuid[1]]=menuid[2];\
                }\
        }\
        { \
                if ('"$expression"'){ \
                        if ($3!="submenu"){\
                                sign="*";\
                        }\
                        else{\
                                sign="";\
                        }\
                        if (idstatus[$1]=="0"){\
                                status="  √";\
                        }\
                        else if (idstatus[$1]==""){\
                                status="";\
                        }\
                        else{\
                                status="  @@";\
                        }\
                        print BLANK $1" "$2 sign status; \
                        lastid=$1;\
                } \
        }\
        END{\
                if ( idstatus[MENUID]=="" && idstatus[lastid]=="0" ){\
                        print MENUID "        0" >> 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----------------------------------
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics