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


需要说明的是由于在Unix系统中,光标在上下左右移动时, Unix系统的read命令无法捕获←、↑、→、↓键的控制字符,无法对光标进行有效的控制,为了获取移动光标的控制字符,这里需要用C语言编写一个函数,其主要功能是在光标进行上下左右移动时,能够准确地返回←、↑、→、↓控制键的ASCII值,函数名为getchar 。
程序分析
由于光标移动过程中涉及光标的行列位置等重复运算,运用函数可减少程序自身的长度,使程序变得短小、精悍 。这里涉及以下一些函数:
1. 画框函数
前面提到显示格式依据表的结构而定,对菜单的边框长度的设置不能固定不变,它要依据菜单标题栏的长度以及标题栏的标题个数而定 。这个函数的功能就是依据菜单界面宽度画边框,参数$1表示边框的横线与竖线 。
menu_x()
{
_R=$1
col_x=1
while [ col_x -le ${S_LENGTH} ]
do
if [ $_R ]; then echo $_R“c”
else echo “c”
fi
col_x=‘expr $col_x2"
done
}
2. 计算实际光标在屏幕上的行列位置函数
选择光标在标题栏左右移动的过程中,需要计算光标在屏幕上的实际位置,通过这个函数可以准确地计算出这个实际位置 。其运算过程是将选择光标在表中的行列位置作为函数的参数,依据这两个参数计算出光标在屏幕上的准确位置,并将选择光标按照计算出的位置在屏幕上准确显示 。其中变量SCREEN- CUR表示表1的元素内容,也就是菜单界面的菜单名称,变量SCREEN-R和SCREEN-C分别表示实际光标在屏幕上位置 。执行的结果是将选择光标的内容按实际光标的位置显示在屏幕上 。
menu_c()
{ _C=$1 # 选择光标在菜单界面的列位置
_R=$2 # 选择光标在菜单界面的行位置
SCREEN_CUR=‘awk -F“|” “NR==$_R { print }”menu|cut -d“|” -f$_C"
if [ $_C -gt 1 ]; then F_C=‘expr $_C - 1"
SCREEN_LENG=‘head -1 menu| cut -d“|” -f0-$F_C|sed -e ‘s/|//g"| awk ‘{ print length($0)}""
else
SCREEN_LENG=0
fi
SCREEN_R=‘expr $_R2"
SCREEN_C=‘expr $C_COL$SCREEN_LENG2"
SCREEN_CUR_X=“33[${SCREEN_R};${SCREEN_C}H${SCREEN_CUR}”
}
3. 计算选择光标在移动过程中位置的函数
选择光标在上下左右的移动过程中,其在菜单界面的位置也随之发生变化,需要通过运算,以确定选择光标在菜单界面的准确位置 。其中参数$1表示上下左右键所返回的ASCII值,当参数$1等于2或3时,表示选择光标在上移或左移; 等于1或4时表示选择光标在向下移动或向右移动 。参数$2表示选择光标移动过程中在表1中的位置,参数$3表示选择光标移动过程中所限定的区间范围 。
menu_x_y()
{ _Z=$1
_S=$2
_L=$3
case $_Z in
2|3) if [ $_S -gt 1 ]
then _S=‘expr $_S - 1"
else _S=$_L
fi
1|4) if [ $_S -lt $_L ]
then _S=‘expr $_S1"
else _S=1
fi
esac
return $_S
}
4. 计算菜单界面每个菜单栏下的菜单数目函数
通常情况下每个菜单标题下所包含的内容是不一样的,因而每个菜单栏下菜单的数目也是不相同的,需要对每个菜单栏下的菜单数目进行计算,参数$1表示选择光标在菜单栏下的列位置 。
menu_row_number()
{ _H=$1
S_NUMBER=‘cut -d“|” -f$_H menu|sed -e ‘s/ //g"-e ‘/^$/d"| awk ‘END { print NR}""
}
5. 执行子程序函数
子程序名存在prg文件中,表2中的元素就是子程序名 。调用子程序的过程实际就是根据选择光标在菜单界面的行列位置将相应位置的元素读出来,然后依据表2所提供的程序名判断是否真实存在,如果存在则执行 。
menu_prg()
{ _C=$1 # 选择光标在菜单界面的列位置
_R=$2 # 选择光标在菜单界面的行位置
prg_name=‘awk -F“|” “NR==$_R { print }” prg|cut -d“|” -f$_C"

推荐阅读