关于KSH中select建立菜单的问题

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

什么选择一条完成后,不是返回菜单,一定要按回车才可以,这个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可以了!我没有想到直接这样调用就可以解决问题!牛叉啊!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航