`
microjava
  • 浏览: 318673 次
  • 性别: 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----------------------------------
分享到:
评论

相关推荐

    非常简单的Shell菜单脚本

    本文介绍的“非常简单的Shell菜单脚本”就是一种基础的Shell脚本应用,它创建了一个简单的菜单系统,使用户能够通过选择编号来执行不同的功能,实现了人机交互的“傻瓜式”操作。 首先,脚本通过`#!/bin/sh`行指定...

    Shell菜单程序源代码

    ### Shell菜单程序源代码知识点解析 #### 一、概述 在Linux系统中,Shell脚本是一种非常实用且强大的工具,可以用来实现各种自动化任务。本文将深入解析一个Shell菜单程序的源代码,帮助读者理解其功能及实现原理...

    shell 菜单编程

    shell 菜单编程 shell 菜单编程 shell 菜单编程

    文件校验和Shell菜单扩展DLL

    标题中的“文件校验和Shell菜单扩展DLL”指的是一个Windows操作系统下的功能增强工具,它允许用户通过右键菜单快速计算并验证文件的校验和。校验和是一种用于验证文件完整性的技术,常用于检查文件在传输或存储过程...

    模拟shell命令解释器操作系统课程设计报告

    ### 模拟Shell命令解释器的关键知识点 #### 设计目的 - **开发环境与目标**:本项目旨在通过使用C语言,在Linux/Unix平台上开发一个命令解释器程序。该程序的目标是模仿现有的shell命令行界面的功能,从而为用户...

    shell扩展右键菜单

    在IT领域,Shell扩展是一种非常实用的技术,它允许开发者自定义Windows操作系统的上下文菜单,即用户通过右键点击文件或文件夹时出现的菜单。本项目基于Visual Studio 2017,提供了完整的源代码,可以用于创建一个名...

    linux shell example例子

    其中一个脚本展示了如何设计一个简单的Shell菜单,使用`until`循环和`case`语句来构建多级菜单,允许用户选择执行不同的命令,如列出目录、改变目录、编辑文件、删除文件或退出菜单。 ### 知识点七:变量赋值与输出...

    Shell实现多级菜单系统安装维护脚本实例分享

    1、一级菜单 2、二级菜单 3、执行操作 脚本参考: 代码如下: #!/bin/bash #author lic(oldboy linux student) #date 1304 DISK_NO=”/dev/sda1″ NGINX_DIR=”/usr/local/tdoa/nginx/sbin/nginx” MYSQL_DIR=”/...

    WindowsShell编程之右键菜单及图标

    在Windows操作系统中,Shell编程是一种用于扩展或定制用户界面的方式,特别是涉及到桌面环境、文件管理器(如资源管理器)以及右键快捷菜单。本文将深入探讨如何利用Windows Shell编程来添加自定义的右键菜单及其...

    windows下shell编程例子

    1、一个简单的shell菜单项例子,没有实际作用。 2、codeproject上的一个copypath的例子,做了扩充,可以拷贝文件路径、文件夹路径和磁盘路径。 3、一个文件属性页例子、可以展示出一个dll所依赖的其它dll文件。 ...

    用Shell扩展实现源代码统计程序_调用IShellExtInit 接口初始化菜单_接口IContexMenu处理右键菜单_BEGIN_COM_MAP

    ATL COM Shell 扩展是一种在Windows操作系统中增强文件管理器功能的技术,它允许开发者创建自定义的右键菜单项,以实现特定的功能。在这个场景中,我们关注的是如何使用ATL COM(Component Object Model)来创建一个...

    利用shell创建文本菜单与窗口部件的方法

    通过以上步骤,你可以构建一个基本的交互式shell菜单系统。随着你对shell编程的深入,可以添加更多的复杂功能,如错误检查、输入验证,甚至可以使用更高级的脚本结构来实现更复杂的菜单系统。在实践中,不断地尝试和...

    Windows Shell扩展编程傻瓜手册大全:上下文菜单扩展

    上下文菜单扩展是Shell扩展的一种常见形式,它允许开发者在用户右键点击文件或文件夹时添加自定义的操作选项。这篇"Windows Shell扩展编程傻瓜手册大全:上下文菜单扩展"详细介绍了如何实现这一功能。 首先,开发上...

    unix shell 编的基于命令行的菜单界面

    在solaris环境下,基于shell编程,编写的一个菜单选择并执行的界面模板,使用者可以根据实际需要更改执行的子程序内容;

    com atl shell extension给windows右键菜单添加菜单项.zip

    Shell Extension可以扩展Windows资源管理器的功能,比如我们看到的右键菜单就是Shell Extension的一个应用。当用户在文件或文件夹上点击鼠标右键时,Shell Extension会根据注册表中的设置显示额外的菜单选项。 在这...

    shell编程实例

    #### 实例七:标准AT&T Bourne Shell菜单脚本 该脚本也是基于一个类似的菜单系统,但使用的是标准的AT&T Bourne Shell语法。 **脚本内容:** ```bash #!/bin/sh # Standard AT&T Bourne Shell # The Party Program ...

    VC Windows Shell扩展 上下文菜单扩展.rar

    VC Windows Shell扩展,设计 制作 上下文菜单扩展,响应右键消息菜单,当用户点击我们添加的菜单项时该方法将被调用。将生成的菜单插入到shell上下文菜单中,返回插入的菜单数,一定要返回正确,包括生成的父菜单也...

    shell编写 shell编写

    Shell编写是Linux或Unix系统中的一种重要技能,它涉及到脚本编程、命令行交互以及系统自动化操作。在本文中,我们将深入探讨Shell脚本的基本概念、语法结构、常见命令及其实用技巧,帮助你掌握这一强大的工具。 ...

    Classic Shell 4.3.0 win 7、8、8.1、10 经典开始菜单

    Classic Shell win 7、8、8.1、10 经典开始菜单

    Classic Shell Win8.1开始菜单v4.2.5中文版.rar

    Classic Shell是一款Windows经典开始菜单恢复工具,能够为你的WIN8/8.1系统找回熟悉的开始菜单。安装包括经典资源管理器:经典资源管理器能为系统的资源管理器添加一个包含复制、粘贴、向上等按钮的工具条,替换...

Global site tag (gtag.js) - Google Analytics