当前位置:Linux教程 - Shell - shell - 关于KSH中select建立菜单的问题

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

关于KSH中select建立菜单的问题
2004-04-23 15:18 pm
来自:Linux文档
现载:Www.8s8s.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可以了!我没有想到直接这样调用就可以解决问题!牛叉啊!