| 您的位置:首页 > 文档 > Shell > |
文章分类热门文章 |
关于KSH中select建立菜单的问题创建:2005-10-26 00:49:46 作者:Unlinux 来自: http://www.Unlinux.com 什么选择一条完成后,不是返回菜单,一定要按回车才可以,这个shell有什么问题吗? 我在bash环境和在ksh下,表现有所不同,在KSH下,所有选择是在一列,而在bash下,是一行有两个选项,请问是怎么回事? 另外就是在bash下,菜单的表现是正常的,但是在ksh下,不能直接返回原先的菜单,请问是什么原因? select ch in "monitor network!" "monitor running process!" "monitor system!" "monitor oracle!" "exit!" do case $ch in "monitor network!") netm ;; "monitor running process!") prom ;; "monitor system!") sysm ;; "monitor oracle!") oram ;; "exit!") break;; esac done 就是这样的,每种SHELL有不同表现也是正常的。KSH就是需要再拍一下回车才出菜单。可以在前面加一句。 PS3="(choose 1-5, or hit RETURN prints menu) " 哦!多谢指点!还有一个问题,就是我想在这个菜单前面加个说明,就是每次菜单出来都是这个样子: ************************************* * system&network monitor program * * version: 1.0 * ************************************* 1) monitor network 2) monitor system ...... 5)exit 请问这个前面的说明应该加到哪里? 下面引用由happydog在 2002/11/30 04:46pm 发表的内容: 哦!多谢指点!还有一个问题,就是我想在这个菜单前面加个说明,就是每次菜单出来都 不客气。(我原来的帐号不知咋的登不上了,还都清了零。气死我了。。。) select 本身没这种功能。但是改成下面这个样子可以基本达到你的要求。(而且在 ksh 中也不需要再按回车键了。) 。。。 echo ' ************************************* * system&network monitor program * * version: 1.0 * ************************************* ' select ch in "monitor network!" "monitor running process!" "monitor system!" "monitor oracle!" "exit!" do case $ch in "monitor network!") netm exec $0 ;; "monitor running process!") prom exec $0 ;; "monitor system!") sysm exec $0 ;; "monitor oracle!") oram exec $0 ;; "exit!") break ;; *) exec $0 ;; esac done 。。。 dx,这个似乎只对主菜单起作用,我进到子菜单中,每选择一项作完后,都直接返回主菜单,而不是返回本身的菜单,请问这个exec $0具体是什么含义,我看书上说是打开标准输入和输出,房在这里的作用是怎样的?$0 表示就是你在执行的这个文件本身的文件名(它应该有执行位-x),这样当你呼叫 exec $0 时,其实就相当于又执行了一遍这个脚本。 所以你说的“每选择一项作完后,都直接返回主菜单,而不是返回本身的菜单”,就应该显而易见了。 可以用下面的方式解决。我只写了一小部分子程序,每个菜单的第2个选项进入下级菜单,5返回上级菜单,6退出程序(主菜单除外)。其余的子程序你依样画葫芦,然后根据自己的要求作适当调整就可以了。 祝好运。 代码: #!/usr/bin/ksh ######################################## # define subroutines # this is your process monitoring subroutine prom() { echo ' +===================================+ | Menu level 2 -- routine prom | +===================================+ ' select ch in "monitor network!" "monitor running process!" "monitor system!" "monitor oracle!" "back" "exit" do case $ch in "monitor network!") netm prom ;; "monitor running process!") abc prom ;; "monitor system!") sysm prom ;; "monitor oracle!") oram prom ;; "back") exec $0 ;; "exit") exit 0 ;; esac done } # another subroutine abc () { echo ' +-----------------------------------+ | Menu level 3 -- routine abc | +-----------------------------------+ ' select ch in "monitor network!" "monitor running process!" "monitor system!" "monitor oracle!" "back" "exit" do case $ch in "monitor network!") dosomething1 abc ;; "monitor running process!") dosomething2 abc ;; "monitor system!") dosomething3 abc ;; "monitor oracle!") dosomething4 abc ;; "back") prom ;; "exit") exit 0 ;; esac done } # end ########################################## ########################################## # main program echo ' ************************************* * system&network monitor program * * version: 1.0 * ************************************* ' select ch in "monitor network!" "monitor running process!" "monitor system!" "monitor oracle!" "exit!" do case $ch in "monitor network!") netm exec $0 ;; "monitor running process!") prom exec $0 ;; "monitor system!") sysm exec $0 ;; "monitor oracle!") oram exec $0 ;; "exit!") break ;; *) exec $0 ;; esac done 感谢DX再次帮助,已经快到成功的彼岸了,只是还有最后一个小小的问题,就是从二级菜单返回主菜单的时候,用exec $0,报错,错误是prom [46]:not found.这个时候,$0应该是指的prom,我用echo $0验证过,是这样,但是直接调用本身可以,换成exec $0,就不行了,并且我是想从二级菜单返回一级菜单。我换为break,但是不稳定,总是不能如我的想法一样返回主菜单。 其他都已经OK!了,从三级菜单返回到二级都很正常。 是不是我哪个参数设置的不对? 不知道怎么会这样,难道你的KSH和我的还不一样?我在OpenBSD的KSH下运行通过的,而且管是$0还是break,都能很好地运行。是不是你没设定 -x 可执行位?(必须!) 不管它了!用其它方法解决,既然你说3级回到2级没问题,那么建议你把程序的最后一段放入子程序main,应该就行了。。。(同样在我的机器上已通过验证) 代码: #!/bin/ksh # <============== 可能会与你不一样 ######################################## # define subroutines # this is your process monitoring subroutine prom() { echo ' +===================================+ | Menu level 2 -- routine prom | +===================================+ ' select ch in "monitor network!" "monitor running process!" "monitor system!" "monitor oracle!" "back" "exit" do case $ch in "monitor network!") netm prom ;; "monitor running process!") abc prom ;; "monitor system!") sysm prom ;; "monitor oracle!") oram prom ;; "back") main # <==================== 修改! ;; "exit") exit 0 ;; esac done } # another subroutine abc () { echo ' +-----------------------------------+ | Menu level 3 -- routine abc | +-----------------------------------+ ' select ch in "monitor network!" "monitor running process!" "monitor system!" "monitor oracle!" "back" "exit" do case $ch in "monitor network!") dosomething1 abc ;; "monitor running process!") dosomething2 abc ;; "monitor system!") dosomething3 abc ;; "monitor oracle!") dosomething4 abc ;; "back") prom ;; "exit") exit 0 ;; esac done } # end ########################################## ########################################## # main program main() { # <============== 加入 echo ' ************************************* * system&network monitor program * * version: 1.0 * ************************************* ' select ch in "monitor network!" "monitor running process!" "monitor system!" "monitor oracle!" "exit!" do case $ch in "monitor network!") netm exec $0 ;; "monitor running process!") prom exec $0 ;; "monitor system!") sysm exec $0 ;; "monitor oracle!") oram exec $0 ;; "exit!") break ;; *) exec $0 ;; esac done } # <============== 加入 main # <============== 加入 老大!可以了!用main可以了!我没有想到直接这样调用就可以解决问题!牛叉啊! 转载自:http://www.unlinux.com/doc/shell/20051026/270.html 【评论】 【加入收藏夹】 【大 中 小】 【打印】 【关闭】 ※ 相关链接
|