在Unix系统下用shell制作通用界面

【在Unix系统下用shell制作通用界面】
目前在Unix系统下用shell编写的菜单程序大都还是采用多级菜单的模式,这种模式的弊端在于菜单的层次多,界面本身不直观,而且在编程过程中,将菜单的显示格式和内容以及所调用的子程序包括在菜单主程序中,使得程序只能满足某个方面的需求,菜单程序本身不具备通用性 。本程序设计采用了一种新的设计思路,将下拉菜单界面作为二维表格来处理,把下拉菜单的内容以及所调用的子程序名称分别存放在这两个二维表中,通过对表的读取,实现了控制光标移动、选择菜单内容以及调用子程序的目的 。采用这种方式编写出来的程序易于维护,通用性强 。在程序本身不做任何改动的情况下,可以在同一操作平台中进行任意移植,因而具有广泛的应用价值 。这种思维模式并不局限在Unix系统下的shell编程,而且对于像C这样的过程化语言也具有一定的借鉴意义 。
设计思路
在下拉菜单制作过程中,整个下拉菜单界面所包含的菜单名称以及所调用的子程序名之间的相互关系构成了二维表,其中子菜单名称和子程序名称作为表的元素,通过选择光标在表中上下左右移动,将表中元素读出来,再进行处理运算,从而达到控制菜单的选择以及子程序调用等目的 。





表1 菜单项

菜单1
菜单2
菜单3
……
菜单n

菜单11
菜单12
菜单13
……
菜单1n

菜单21
菜单22
菜单23

菜单2n

菜单31
菜单32
菜单33

菜单3n

……





菜单m1
菜单m2
菜单m3

菜单mn





表2 对应各菜单项的子程序

子程序11
子程序12
子程序13
……
子程序1n

子程序21
子程序22
子程序23

子程序2n

子程序31
子程序32
子程序33

子程序3n

……





子程序m1
子程序m2
子程序m3

子程序mn
从上面的两个表中不难看出除表1中的第一行为标题行(菜单栏),表1与表2有相同结构,两个表之间的元素存在着一一对应的关系,即每个菜单名称下对应着所调用的程序名(备注: 由于每个菜单标题栏下的子菜单的内容是不一样的,因而每个子菜单下的菜单数目也各不相同,表中一些元素可以是空值,它表示在此没有菜单选择项) 。
文中介绍方法的技术难点在于选择光标位置与实际光标位置的关系 。所谓选择光标位置是指在上下左右键的控制下,光标在菜单界面的位置,也就是光标在表中的行和列的位置 。而实际光标位置是指光标在计算机屏幕上的实际位置 。如何通过选择光标位置计算出实际光标位置是本程序的一个难点 。本程序的处理办法是将选择光标的行列位置分别作为计算函数的参数,通过函数计算出实际光标的位置 。
实现步骤
先将菜单的内容按照一定的格式显示在计算机屏幕上 。显示格式要依据表的结构与内容而定,而不能固定不变 。如果事先固定下来,会使显示格式与内容之间产生矛盾,难以达到相互之间的统一,程序就不具备通用性 。
选择光标在菜单栏左右移动确定选择项目的同时将菜单栏下所包含的子菜单内容显示出来 。菜单栏最右端的菜单选择项一般情况下表示“退出”,当选择光标处于这个位置时,回车后退出整个菜单的选择 。
在菜单栏中回车或按↓键进入菜单栏下一级子菜单,按照所显示的子菜单内容,选择光标上下移动确定所选定的子菜单内容,回车执行所调用的子程序,←、→两个键退出子菜单的选择 。

推荐阅读