精华内容
下载资源
问答
  • 参考资料: windows右键菜单开发--with vs2008(2005) ...但是以前给自己的一个程序做过一个右键菜单,是通过windows的shell接口来实现的,所以在这里回忆总结一下,顺便与大家分享下经验。(其实网上google下能

    参考资料:

    windows右键菜单开发--with vs2008(2005) or vc9(vc8)


    最近项目中有利用IContexMenu实现右键菜单的例子,想试验一下,然而参照了很多资料,出现了很多错误,捣鼓了几天,还是没有出现想要的效果。

    在这里,把程序的编写过程写下来,希望能得到熟悉Shell的高手指点。


    编译工具:VS2005(据传说,各个编译工具的区别主要在于所用的SDK。VS2008用的是SDK3.5,VS2005用的是SDK2.0,两者差别不大。对于Shell编程来讲,VC6就已经足够了。只是VS2005(2008)会与VC6或者VS2003有所区别)。

    开发环境:Win7 32位,中文旗舰版

    期待功能:在Windows的右键菜单里加入自己的菜单,点击之后能够发出消息,会有消息响应。效果如图:


    程序编写:

    第一步:打开VS2005,新建ATL工程,命名为MyShell。各选项设置如图:





    点击【完成】,完成项目的创建。


    可以看到,在解决方案MyShell下,生成了两个工程:MyShell和 MyShellPS。



    此时,编译报错。详见错误处理一


    第二步:建立接口。


    我们的dll是要加载到win外壳程序中的,这是通过注册表来实现的(后面讲具体实现方法),当右键点击弹出菜单前,系统会根据注册表信息判断要去加载哪些dll,当发现我们的dll时,加载,并根据shell的接口来实现我们定义的函数。


    shell的接口是固定的,他不会在意你的函数是什么,只要你实现了他的接口,他就会去执行。



    右键点击工程MyShell,选择【添加 类】,在向导中选择ATL->ATL简单对象(Simple Objec),点击【添加】。



    在简称(Short Name)中写上你的接口名字,写为【MyMenu】,其他选项程序会自动填充。



    此时点击【完成】就好。


    这时候会看到,类视图区多了2个东西,一个CMyMenu的类,还一个IMyMenu的接口。




    (可选)为接口添加方法(Add method)

    右键单击IMyMenu,选择 添加方法(Add method),自定一个方法名(函数),比如'MyMenuMethod',参数类型自定义,看你程序需求了。



    在方法MyMenuMethod',我只是做了简单的message

    STDMETHODIMP CMyMenu::MyMenuMethod(void)
    {
    	AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
    	// TODO: 在此添加实现代码
    	::MessageBox( NULL, _T("In MyMenuMethod"), _T("MyShell"), MB_OK);
    
    	return S_OK;
    }

    此时,可以编译一下。在不同编译环境下可能会出现不同问题,因此应该养成完成一项修改,编译一下的习惯。

    得到出错信息如下:

    error PRJ0050: 未能注册输出。请确保您有修改注册表的相应权限。

    见错误处理,错误一的处理。

    error C2787: 'IContextMenu' : no GUID has been associated with this object
    error C2440: 'initializing' : cannot convert from 'DWORD_PTR' to 'const IID *'
    error C2440: 'initializing' : cannot convert from 'ATL::_ATL_CREATORARGFUNC (__stdcall *)' to 'DWORD_PTR'

    见错误处理,错误二的处理。



    第三步:在CMyMenu的基类中添加IShellExtInit、IContextMenu。

    要实现shell的所有接口,但ATL为我们自动添加的接口里不包含IShellExtInit、IContextMenu,所以要手动补充上。

    <span style="color:#454545;">class ATL_NO_VTABLE CMyMenu :
    	public CComObjectRootEx<CComSingleThreadModel>,
    	public CComCoClass<CMyMenu, &CLSID_MyMenu>,
    	public IDispatchImpl<IMyMenu, &IID_IMyMenu, &LIBID_MyShellLib, /*wMajor =*/ 1, /*wMinor =*/ 0></span><span style="color:#33cc00;">,
    	public IShellExtInit,
    	public IContextMenu</span>

    并在宏声明那里添加2个接口

    <span style="color:#454545;">BEGIN_COM_MAP(CMyMenu)
    	COM_INTERFACE_ENTRY(IMyMenu)
    	COM_INTERFACE_ENTRY(IDispatch)
    	</span><span style="color:#33cc00;">COM_INTERFACE_ENTRY(IShellExtInit)
    	COM_INTERFACE_ENTRY(IContextMenu)</span><span style="color:#454545;">
    END_COM_MAP()</span>

    注意:新添加的两个接口基类,需要头文件支持,我们把这2个头文件加到总声明 stdafx.h 里。

    #include <shlobj.h>
    #include <shobjidl.h>

    在类视图中便会显示出CMyMenu类里的2个新接口。


    此时编译会报错,因为接口没有被实现。

    错误 1 error C2259: 'ATL::CComObject<Base>' : cannot instantiate abstract class c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcom.h 1792


    第四步: 实现接口

    1. IShellExtInit  鼠标选中它,可以看到它里面只有一个纯虚函数



    函数原型为:

    <pre name="code" class="cpp">        virtual HRESULT STDMETHODCALLTYPE Initialize( 
                /* [in] */ LPCITEMIDLIST pidlFolder,
                /* [in] */ IDataObject *pdtobj,
                /* [in] */ HKEY hkeyProgID) = 0;

    
    


    LPCITEMIDLIST  这个类型名2008和2005是有区别的,2008中会显示PCIDLIST_ABSOLUTE,其实他们是本质是一个东西(#define   PCIDLIST_ABSOLUTE     LPCITEMIDLIST),他是指向一个ITEMIDLIST的结构体指针。这个结构体标示了右键点击时对应的文件夹。如果属性页扩展则这个值为NULL即可。

    pdtobj 指向 IDataObject 接口的指针。


    在我们的类中重写这个虚函数,直接把定义复制过来即可,用来做些初始化动作。

    MyMenu.h中:

    virtual HRESULT STDMETHODCALLTYPE Initialize( 
    		/* [in] */ LPCITEMIDLIST pidlFolder,
    		/* [in] */ IDataObject *pdtobj,
    		/* [in] */ HKEY hkeyProgID);

    (由于在objbase.h中有如下定义:

    define STDMETHOD(method)       virtual HRESULT STDMETHODCALLTYPE method

    因此上述代码也可写为:

            STDMETHOD(Initialize)( 
                /* [in] */ LPCITEMIDLIST pidlFolder,
                /* [in] */ IDataObject *pdtobj,
                /* [in] */ HKEY hkeyProgID) = 0;)
    
    )


    MyMenu.cpp中:

    HRESULT STDMETHODCALLTYPE CMyMenu::Initialize( 
    	/* [in] */ LPCITEMIDLIST pidlFolder,
    	/* [in] */ IDataObject *pdtobj,
    	/* [in] */ HKEY hkeyProgID)
    {
    	return S_OK;
    }

    (由于在objbase.h中存在如下定义,

    #define STDMETHODIMP            HRESULT STDMETHODCALLTYPE
    因此上述代码也可写为

    STDMETHODIMP CMyMenu::Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
    {
    	return S_OK;
    }

    2.IContextMenu: 这里有3个接口,方法同上,鼠标左键单击点中,可以查看到。

    GetCommandString      InvokeCommand    QueryContextMenu

    直接在把基类中的声明复制粘贴过来,将这3个都实现。暂时都直接返回 return S_OK。

    目前为止我们已经重写了4个虚函数(没有其他代码,只简单的return S_OK;),所以框架结构已经完全建立好了。点击 编译,查看下有没有笔误之类的错误。



    第四步: 补充代码。

    要补充的就是上面4个接口函数而已,在补充之前我们要清楚他们分别是做什么用的。

    1.Initialize

    顾名思义。。。初始化用的。此文章不做介绍,简单来说在这里可以得到当前文件(夹)路径。具体可以参照msdn。


    2.GetCommandString

    再次顾名思义下,获得右键菜单命令信息,包括帮助信息,命令的名称(详见MSDN)


    STDMETHODIMP CMyMenu::GetCommandString(UINT_PTR idCmd, UINT uType, UINT * pwReserved, LPSTR pszName, UINT cchMax)
    {
    	if ( (idCmd != 102) && (idCmd != 103))
    	{
    		return E_INVALIDARG;
    	}
    	lstrcpynA(pszName, _T"This is a test info", cchMax);
    	return S_OK;
    }

    这个接口没有实际意义,我们甚至可以不深究它。

    idCmd是传进来的菜单命令id的偏移量。 这个值是我们自己定义给要添加菜单的值。 102 和 103都是这样,当点击我们添加的菜单后,命令id的偏移量肯定是我们自定义的,后面会介绍,如果不是,将会返回错误,return E_INVALIDARG。如果是,则向参数 pszName 赋值。返回S_OK。


    3.QueryContextMenu

    想菜单中添加内容,详见msdn。

    这个函数是最为关键的函数之一。(其实关键函数有2个,下面那个就是另一个之一)

    要增加几个菜单,在什么位置,叫什么名字,带不带图标,点击后命令id等等都是这里完成的。

    虽然东西说起来挺多,但是函数确很少。。。。对,就一个函数!


    InsertMenu,注意,我们这里并没有用到mfc。

    WINUSERAPI
    BOOL
    WINAPI
    InsertMenuW(
        __in HMENU hMenu,
        __in UINT uPosition,
        __in UINT uFlags,
        __in UINT_PTR uIDNewItem,
        __in_opt LPCWSTR lpNewItem);


    STDMETHODIMP CMyMenu::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
    {
    	InsertMenu(hmenu,indexMenu,MF_SEPARATOR|MF_BYPOSITION,0,NULL);//分割线
    	InsertMenu(hmenu, indexMenu+1, MF_STRING | MF_BYPOSITION, idCmdFirst + 102, _T("XXXX"));
    	InsertMenu(hmenu, indexMenu+2, MF_STRING | MF_BYPOSITION, idCmdFirst + 103, _T("YYYY"));
    	InsertMenu(hmenu,indexMenu+3,MF_SEPARATOR|MF_BYPOSITION,0,NULL);//分割线 
    	return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(103 + 1));
    }

    InsertMenu 这个函数大家应该不陌生,初学mfc时候应该有学过类似的,关于菜单操作MF_BYPOSITION还是MF_BYCOMMAND,这些mfc中的菜单操作也用到过。idCmdFirst 是系统传进来的id首值,我们自定义一个偏移量,表示我们的菜单id(这里用了102,103),最后将下一个命令id返回给系统,告诉系统后面的菜单的命令从哪里开始偏移。

    (可选)在这里我们可以给菜单前面加个图:将图导入资源(bitmap),或是自己画一个,注意大小不要超过13x13

    LPTSTR lptStr =MAKEINTRESOURCE( IDB_BITMAP1);HBITMAP hBitmap=LoadBitmapW(ghInstance,lptStr);//gHinstance 是一个HINSTANCE类型的全局变量,在dll入口函数(DllMain)中,将系统传进来的参数hInstance保存。

    </pre><pre name="code" class="cpp" style="color: rgb(69, 69, 69); font-size: 14px; line-height: 21px; "><pre name="code" class="cpp">LPTSTR lptStr =MAKEINTRESOURCE( IDB_BITMAP1)
    ;HBITMAP hBitmap=LoadBitmapW(ghInstance,lptStr);//gHinstance 是一个HINSTANCE类型的全局变量,在dll入口函数(DllMain)中,将系统传进来的参数hInstance保存。
    SetMenuItemBitmaps(hmenu,indexMenu+1,MF_BYPOSITION,hBitmap,hBitmap); 
    
    

    4.InvokeCommand   

     关键函数的另一个之一,定义菜单的消息响应。

    请msdn下查下CMINVOKECOMMANDINFOEX里的 lpVerb参数的意思,你会发现他的高位标示了是字符串还是命令id偏移量。我们对字符串不关心,我们关心的是命令id. 这个函数是要实现具体点击菜单后所要实现的功能。所以判断是点了 XXXX(102),还是YYYY(103)菜单呢。

    <span style="font-family:tahoma, helvetica, arial;">STDMETHODIMP CMyMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
    {
    	if(HIWORD(((CMINVOKECOMMANDINFOEX *) lpici)->lpVerbW))
    	{
    		return S_OK;
    	}
    	else
    	{
    		if(LOWORD(lpici->lpVerb)==102)
    		{
    			MessageBox(NULL,_T("1111"),_T("MyShell"),MB_OK);
    		}
    		if(LOWORD(lpici->lpVerb)==103)
    		{
    			MessageBox(NULL,_T("2222"),_T("MyShell"),MB_OK);
    		}
    	}
    	return S_OK;
    }</span>

    在这里也可以用先前添加的 接口方法,比如在103里注释掉messagebox,换成MenuFuctionb();可以试试。


    至今为止,代码部分已经编写完成。编译一下,生成dll。

    下面可以看一下怎么注册我们的dll。


    注册DLL

    截止到目前,我们所有shell扩展接口都实现了,编译(release版),讲dll考入客户机(可以是虚拟机,或者你自己的机器)。

    1、首先是注册我们的dll

    在cmd里写 

    Regsvr32 MyShell.dll
     (这么写的前提是MyShell.dll所在位置是系统盘的system32文件夹下,如果没在这里,你可以把全路径写上)


    2、然后是修改注册表

    我们想让所有文件夹和文件点击右键时候都看到我们的菜单。

    注册表位置:HKEY_CLASSES_ROOT -> *  -> shellex -> ContextMenuHandlers添加新键 MyShell (这个名字你随意起)然后设置默认键值为 REG_SZ 类型,数据写 {xxxx.........} 具体数据写什么呢,当然是我们产品的guid,他的位置在我们程序中,新建工程时候vc已经帮我们定义好了,他是一个唯一(概率上来讲)的值。

    在解决方案视图中,源文件目录下,找到MyShell. idl文件,打开查看, library 下的 uuid就是我们要的号码,把它复制下来,



    我这里是{11B5203F-0C25-47E5-AAAC-9C959E46BCAE},你那里肯定不是这个数,因为他是vc随机生成的,目的就是为了避免产品间重名冲突。所以我们的注册表修改完后应该是这个样子的



    她不包括文件夹。所以我们还要修改文件夹的信心。注册表位置:HKEY_CLASSES_ROOT-->Directory --> shellex --> ContextMenuHandlers建立一个 MyShell键,设置值与‘*’相同





    目前为止都操作完毕了,对于注册表操作,程序员最好去写一个简单的安装程序,win控制台程序就可以,用我们的函数来进行注册dll和修改注册表。当然想对应的你要写好你的卸载程序,去移除这些注册表。



    调试方法,待续……


    展开全文
  • linux shell编程菜单选择(一)

    万次阅读 2012-11-29 22:19:12
    编一个shell 编写一个shell程序,使用shell编写一个菜单,分别实现列出以下内容:(1)目录内 容、(2)切换目录、(3)创建文件、(4)编辑文件、(5)删除文件的功能 #!/bin/sh until echo "1.目录内容" echo "2.切换目录...

    linux程序设计老师布置的作业:根据自己的写法和参考网上的

    编一个shell 编写一个shell程序,使用shell编写一个菜单,分别实现列出以下内容:(1)目录内
    容、(2)切换目录、(3)创建文件、(4)编辑文件、(5)删除文件的功能

    #!/bin/sh
    until
    		echo "1.目录内容"
    		echo "2.切换目录"
    		echo "3.创建文件"
    		echo "4.编辑文件"
    		echo "5.删除文件"
    		echo "6.退出菜单"
    		read input
    		test $input = 6
    		do
    			case $input in
    			1)ls;;
    			2)echo "enter target directory"
    				read dir
    				cd $dir;;
    				
    			3)echo "enter a file name"
    			 read file
    			 touch $file;;
    			 
    			4)echo "enter a file name:"
    					read file
    					vi $file;;
    			5)echo "enter a file name"
    				read file
    				rm $file;;
    			6)echo "请输入选择(1-6)"
    			esac
    			done


    另一种写法出自:http://wolfchen.blog.51cto.com/2211749/964615

    #!/bin/bash
    cat << EOF
    ********please enter your choise:(1-6)****
    (1) List you selected directory
    (2) Change to you selected directory
    (3) Create a new file
    (4) Edit you selected file
    (5) Remove you selected file.
    (6) Exit Menu.
    EOF
    read -p "Now select the top option to: " input
    case $input in 
    1) ls;;
    2) echo "Enter target directory:"
    read dir
    cd $dir;;
    3) echo "Enter a file name:"
    read file
    touch $file;;
    4) echo "Enter a file name:"
    read file
    vi $file;;
    5) echo "Enter a file nmae:"
    read file
    rm $file;;
    esac


    展开全文
  • linux shell编程菜单选择(二)

    千次阅读 2012-11-29 22:17:21
    #!/bin/bash cat *-(A)输入A查看/etc/password最后5个用户。... *-(B)输入B的话就显示系统开机时间多久了 *-(C)输入C的话就判断当前磁盘根目录使用情况是否超过50%,如果超过50%就显示“disk space is used ...

    转自:http://wolfchen.blog.51cto.com/2211749/964997

    #!/bin/bash
    cat <<EOF
     *-(A)输入A查看/etc/password最后5个用户。
     *-(B)输入B的话就显示系统开机时间多久了
     *-(C)输入C的话就判断当前磁盘根目录使用情况是否超过50%,如果超过50%就显示“disk space is used over 50%”;如果没超过50%就显示“disk space is user below 50%”
     *-(D)输入D的话就显示出系统当前处于LISTEN状态的PID进程程序名称,以“program-name(pid)”这种形式显示。
     *-(E)输入E的话获取系统的IP和掩码,以"IP/NETMASK"形式显示
     *-(F)输入F的话添加系统用户,完了后添加该用户密码(记得给以提示操作)
     *-(G)输入G的话显示系统使用率最多的10条命令,还有使用的次数
    EOF
    read -p "请输入你的选择 A|B|C|D|E|F|G: " input
    case $input in
      A)
    	tail -n 5 /etc/passwd | awk -F: '{print "user:"$1, "UID"$3}'
      ;;
      B)
    	 awk '{print $1/60/60"hours"}' /proc/uptime
      ;;
      C)
    	 df -h | awk '$6=="/"{if($5>50)print "disk space is used over 50%";else print "disk space is user below 50%"}'
      ;;
      D)
    	 netstat -nptl | awk '/LISTEN/{print $7}'|awk -F/ '{print $2"("$1")"}'
      ;;
      E)
    	 ifconfig eth0 | awk -F"[ :]+" 'NR==2{print $4"/"$NF}'
      ;;
      F)
    	echo -e "Please input username"
            read user
            echo -e "Please input password"
            read pass
            useradd $user
            echo $pass | passwd --stdin $user
      ;;
      G)
    	awk '{++a[$1]}END{for(i in a)print i,a[i]|"sort -k2 -nr"} ~/.bash_history' | head
      ;;
      *)
        printf "your input is wrong\n"
    ;;
    esac
    


    展开全文
  • shell编程实现一些小游戏

    万次阅读 2018-08-02 10:50:32
    啊...这几天被逼着学习云计算,十分痛苦 然后痛苦归痛苦,总的来...# 菜单 echo "欢迎来到虚空台,凡人,这里你可以得到匹敌世界的财富,拥有灭星的力量,只要...你能活下去" read mainmenu() #返回 {  ...

    啊...这几天被逼着学习云计算,十分痛苦

    然后痛苦归痛苦,总的来说,对linux的理解还是有了些深入的

    今天就把期间做的一些小游戏源码发上来吧

    #!/bin/bash
    # 菜单
    echo    "欢迎来到虚空台,凡人,这里你可以得到匹敌世界的财富,拥有灭星的力量,只要...你能活下去"
    read
    mainmenu()                             #返回
    {
       echo ' =========================================== '
       echo '  **              1.虚空斗场             **  '
       echo '  **              2.落日神殿             **  '
       echo '  **              3.殷红梦境             **  '
       echo '  **              4.离开此界             **  '
       echo " =========================================== "
       read -p "选择吧,你要传送去的地方: " num
       options=( 虚空斗场 落日神殿  殷红梦境  离开此界 )
        case $num in
     1)
            submenu
            ;;
     2)
            cqyx
            ;;
     3)
            nswc
            ;;
     4)
            exit
            ;;
     *)
            echo "输入错误:"  ;;
    esac
    mainmenu
    }
    submenu(){
    #!/bin/bash
    echo "这里是虚空的竞技场,来自万界的强者们汇聚于此,败者化为枯骨,胜者将分享虚空的宝物"
    read
    echo "本次比赛将由虚空之树公证"
    echo "虚空之树公证中......"
    read
    echo "根据以下提示信息,选择您要压注的角色"
    game=(虚空剑豪 青莲剑歌 祖龙 恒星撕裂者 虫族二等 没有人!)
    num=$[RANDOM%6]
    computer=${game[$num]}
    echo "q.虚空剑豪"
    echo "w.青莲剑歌"
    echo "e.祖龙"
    echo "r.恒星撕裂者"
    echo "t.虫族二等" 
    echo "y.离开虚空竞技场"
    read  -p  "请选择 q w e r t 所代表的五位强者之一 ,或者作为一个懦夫,选择y,离开这里"  person
    echo "一场惨烈的战斗!获胜者是:$computer"
    case  $person  in
    q)
           if [ $num -eq 5 ];then
                  echo "来自虚空的五位强者同归于尽了,真是爆冷阿!"
                  mainmenu
           elif [ $num -eq 0 ];then
                  echo "见鬼,你压注的强者胜利,根据契约,你得到高等虚空生物核心X1"
                 mainmenu
           else
                  echo "你压注的强者已经变成了渣渣!凡人,作为代价,献出你的灵魂吧!"
                 mainmenu
      fi;;
    w)
              if [ $num -eq 1 ];then
                  echo "来自虚空的五位强者同归于尽了,真是爆冷阿"
           elif [ $num -eq 2 ];then
                  echo "见鬼,你压注的强者胜利,根据契约,你得到龙渊剑X1!"
           else
                  echo "你压注的强者已经变成了渣渣!凡人,作为代价,献出你的灵魂吧!"
    mainmenu
           fi;;
    e)
           if [ $num -eq 5 ];then
                  echo "来自虚空的五位强者同归于尽了,真是爆冷阿!"
           elif [ $num -eq 2 ];then
                  echo "见鬼,你压注的强者胜利,根据契约,你得到龙牙+龙魂+龙之力!"
           else
                  echo "你压注的强者已经变成了渣渣!凡人,作为代价,献出你的灵魂吧!"
    mainmenu
        fi;;
    r)
           if [ $num -eq 5 ];then
                  echo "来自虚空的五位强者同归于尽了,真是爆冷阿!"
           elif [ $num -eq 3 ];then
                  echo "见鬼,你压注的强者胜利,根据契约,你得到行星泯灭炮X1!"
           else
                  echo "你压注的强者已经变成了渣渣!凡人,作为代价,献出你的灵魂吧!"
    mainmenu
           fi;;
    t)
           if [ $num -eq 5 ];then
                  echo "来自虚空的五位强者同归于尽了,真是爆冷阿!"
           elif [ $num -eq 4 ];then
                  echo "见鬼,你压注的强者胜利,根据契约,你得到虫母矿场15235地契x3!"
           else
                  echo "你压注的强者已经变成了渣渣!凡人,作为代价,献出你的灵魂吧!"
    mainmenu
      fi;;
    y)
                  echo "请重新选择游戏:"     
                  mainmenu
                  ;;

    *)
           echo "你必须选择这五位强者中的一员!                ——来自魔鬼撒阿的警告"
    mainmenu
    esac
    }

    cqyx()
    {
    game=(太阳之力 海洋之力 雷霆之力 逃离落日神殿)
    num=$[RANDOM%3]
    computer=${game[$num]}
    echo "落日神殿最后的守护者者拥有太阳之力,海洋之力和雷霆之力"
    echo "你必须使用和它相同的力量"
    echo "否则..."
    read
    echo "落日降临,守卫者苏醒了!选择你的力量,在还来得及的时候"
    echo "a.太阳之力"
    echo "b.海洋之力"
    echo "c.雷霆之力" 
    echo "d.逃离落日神殿"
    read  -p  "将篆刻有 a b c d 的符文石放入祭台! :"  person
    case  $person  in
    a)
           echo "这位的守护者者拥有的力量是:$computer"
           if [ $num -eq 0 ];then
                  echo "你击碎了守护者,获得了落日神殿所有的黄金!"
                  mainmenu
           else
                  echo "你的力量耗尽,成为了落日神殿诸多的石像之一..."
                  mainmenu
           fi;;
    b)
           echo "这位守护者拥有的力量是:$computer"
           if [ $num -eq 1 ];then
                  echo "你击碎了守护者,获得了落日神殿所有的黄金!"
                  mainmenu
           else
                  echo "你的力量耗尽,成为了落日神殿诸多的石像之一..."
                  mainmenu
           fi;;
    c)
           echo "这位守护者拥有的力量是:$computer"
           if [ $num -eq 2 ];then
                  echo "你击碎了守护者,获得了落日神殿所有的黄金!"
                  mainmenu
           else
                  echo "你的力量耗尽,成为了落日神殿诸多的石像之一..."
                  mainmenu
           fi;;
    d)
                  echo "返回虚空台"     
                  mainmenu
                  ;;
    *)
                  echo "必须输入a-d !!!"
                  mainmenu
    esac
    }
    nswc(){
    #殷红梦境
    #RANDOM 为系统自带的随机数:0-32767
    echo "殷红梦境的主宰,是血恶魔,一个喜欢游戏的恐怖恶魔,没有任何手段可以战胜他,只有与他进行游戏,并获得胜利,才可能离开..."
    echo "殷红梦境分为50层,血恶魔会夺取每一个进入者的心脏,将它藏在任意一层,现在,在时间限制内,找到你的心脏"
    echo "否则..."
    read
    num=$[ RANDOM%50+1 ]
    while :
    do
             read -p "嘿嘿嘿...猜猜看,你的心脏...在哪里?!:" cai
             if [ $cai  -eq  $num  ];then
              echo "你的心脏的确在这一层,和它埋在一起的,还有50枚珍贵的洛南斯文明古代金币"
              mainmenu
             elif [ $cai -gt $num  ];then
              echo "你的心脏并不在这里,根据感应,它在更深沉的地方!"
             else
              echo "你的心脏并不在这里,根据感应,它在更高远的地方!"
             fi
    done
    }
    mainmenu

    哈哈其实这些游戏大家都玩过的,只是更改了UI.....嗯如果这些真的算UI的话,那么大家能看出来它原本是什么游戏吗

    展开全文
  • Shell实现菜单选择

    2020-02-13 09:15:10
    Shell实现菜单选择: https://notes.z-dd.net/2019/10/28/Shell%E5%AE%9E%E7%8E%B0%E8%8F%9C%E5%8D%95%E9%80%89%E6%8B%A9/
  • Shell脚本编程之创建文本菜单

    千次阅读 2016-06-11 15:32:05
    Shell脚本编程之创建文本菜单
  • #!/bin/bash #written by wubo #blog:wbmtf.blog.51cto.com while : do echo "请输入你要进行的操作:" select var in "edit file" "view ip" "delete file" "change director...
  • windows Shell编程

    2018-10-10 12:23:36
    windows shell扩展编程技术,可以实现桌面右键菜单功能,桌面图标修改功能
  • 这篇文章主要介绍了Shell实现多级菜单系统安装脚本实例分享,本文脚本用多级菜单实现LAMP、LNMP安装展现效果,需要的朋友可以参考下:提示:本脚本主要实现多级菜单效果,并没有安装LAMP、LNMP环境,如果要用在实际...
  • Shell 编程

    千次阅读 2011-11-29 13:58:50
    第26章 Shell 编程 在DOS操作系统中,可以把多个DOS指令放在文件里作批处理。在Linux系统中也有类似的批处理命令,这些批处理命令在Linux中叫做Shell脚本(Shell Script )。其功能已经和一般的高级语言不相上下...
  • 编译成功后,可以看到已经在注册表中实现了,但是桌面上右键菜单后却没有显示出来。 一番折腾下来,终于找到问题,操作系统是64位的,扩展程序必须也是64位的,因此重新编译成64位的就运行成功了。 编译64...
  • shell编程

    2019-09-24 09:59:29
    lShell命令行的运行 l编写、修改权限和执行Shell程序的步骤 l在Shell程序中使用参数和变量 l表达式比较、循环结构语句和条件结构语句 ...对Shell命令行基本功能的理解有助于编写更好的Shell程序,在执行Sh...
  • Shell编程简单实现四则运算

    千次阅读 2012-07-20 18:48:06
    #!/bin/sh main() { echo "#############################" echo "## usage: num1 +/-/#// num2##" echo "## example: 1 + 1 ##" echo "## '*' is replaced by '#' #
  • 在前两篇教程中,我们已经学会了如何在资源管理器的右键菜单中增加自己的菜单项,及如何将菜单分组为子菜单。在学习过程中,读者可能注意到,在VC中编译成功后,此时我们的扩展DLL已自动注册到系统中,此时Windows...
  • Linux shell 编程

    2016-11-22 10:25:58
    用户可以将 Linux 的命令以编程的方式组合起来提交给 shellshell 负责解释执行这种程序设计语言所编写的代码。这种程序设计语言构成的文件成为 shell script 或 shell 脚本。 Shell 脚本是包含一个或多个 s
  • 看官们在编写程序的时候,可能会需要向用户提供一个选择菜单。怎么办?不用着急,咱们今天就来说说 如何编写选择菜单。 打开终端,新建立一个叫sample.sh的脚本文件,并且在终端中输入下面的内容,然后保存该...
  • shell 以及shell编程

    千次阅读 2010-09-25 08:55:00
    shell是一种命令语言,同时又是一种程序设计语言。shell的语言处理能力,使得用户能够方便地定义各种变量、参数,并使用各种控制语句编写复杂的命令程序完成多种工作。本课介绍shellshell程序设计语言、shell的...
  • shell 下的select实现菜单

    千次阅读 2017-04-23 23:00:16
    假设需要在shell实现一个菜单,估计会使用 循环和read实现交互,在学习中发现一个select可在shell下很方便的实现这种交互菜单 1. select 语法 select var in ... do #your code done 2. 示例 #...
  • windows shell 编程

    千次阅读 2015-03-30 10:27:04
    谈到Windows Shell编程,Shell扩展是最重要的科目之一,绝大多数商业应用的最酷特征的都是通过Shell扩展实现的,而且有许多显著的系统特征实际都是插入了扩展代码。Shell扩展尤其令人激动的是它允许你把你的应用作为...
  • shell编程简介

    千次阅读 2007-07-25 12:15:00
    Bourne Shell 介绍:Bourne Shell 基础及其他很多有用的特性,shell编程及组织。 主要内容: .shell基础 基本介绍,环境,选项,特殊字符 .shell变量 用户定义变量,环境变量,位置变量(shell 参数) .shell script...
  • 入门级linux编程新手,学到case语句,用shell编写了一个游戏菜单,随着后面的学习,肯定还需要很多优化,先当作练手,加深学习印象吧。~~  写这个程序时候犯的错误有:  1.引用变量时候没有加上$  2.用...
  • 编写一个显示菜单的shell程序,利用函数实现简单的菜单功能,n的值由键盘输入: (1)计算1到n的奇数之和 (2)计算1到n的阶乘 (3)计算1到n的所有素数 (4)退出程序 Please enter function select and number: 1 ...
  • shell编程基础

    千次阅读 2012-10-10 08:50:31
    收藏着,以便平时参考 ...shell 是unix操作系统提供的命令解释器,是用户与操作系统之间的接口。当你注册到unix系统的任何一个用户,系统都会为你启动一个shellshell会一直等待你的指令,
  • 运用select和case可以制作简单的交互式菜单。 #! /bin/bash select CHIOCE in show help exit do case "$CHIOCE" in show) ls
  • linux shell 编程简介

    2011-09-05 18:49:50
    介绍:Bourne Shell 基础及其他很多有用的特性,shell编程及组织。 主要内容: .shell基础 基本介绍,环境,选项,特殊字符 .shell变量 用户定义变量,环境变量,位置变量(shell 参数) .shell
  • shell编程必备

    千次阅读 2019-09-12 10:33:09
    选择 改变bash的提示符实际上就是改变变量() $HOME PWD∗∗PWD **PWD∗∗PS1** $PS2 在shell脚本中,用来读取文件内各个域的内容并将其赋值给...不是shell具有的功能和特点是() A:管道 B:输入输出重定向 ...
  • 一步步理解Shell编程之函数用法

    千次阅读 2018-02-06 02:55:11
    大家好,今天给大家分享的是shell编程中的函数用法,当然这个函数和数学的函数是不一样的,那么在shell中的函数是什么样的,那么一起来看一下。 1、首先在linux中它有一个命令是:alias 也就是别名的意思,那么这...
  • Windows Shell 编程学习总结

    千次阅读 2017-03-19 12:57:51
    Windows Shell 编程 http://blog.csdn.net/chchzh/article/details/2210729 序言:  看过一些对windows 外壳的扩展程序,在使用上一般都是直接利用windows的外壳API做一些工作 ,因为外壳操作需要一些比较专业...
  • Shell编程基础

    千次阅读 2006-04-14 16:56:00
    为什么要使用Shell编程?Linux操作系统是由UNIX操作系统发展起来的.UNIX操作系统中所体现出来的思想和哲学深沉的影响了现代其他的操作统.在UNIX系统中提供了许多不同的Shell程序.大多数的商业UNIX提供了Korn Shell,...
  • 实验9:shell及shell编程

    千次阅读 2016-04-08 15:07:15
    实验9:shell及shell编程 1、实验目的 1)sed的使用; 2)awk的应用; 3)shell及shell编程; 4) 与用户启动相关的文件及使用。 2、实现设备 一台装有Windows操作系统和Linux机系统的微机或服务器。 3、实验方法与注意...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,680
精华内容 9,072
关键字:

shell编程实现菜单功能