SCO UNIX 5.0.5下通用菜单程序(用bsh制作,含源码)
2004-04-23 15:18 pm来自:Linux文档
现载:Www.8s8s.coM
地址:无名
笔者的c语言基础还好,最近又狠补了一下bsh,觉得将c的良好界面、模块化设计思想同
sh的强大处理能力及不需编译即可执行的特点相结合,那将是一件很有趣的事情。用命令:
file bin/qtyj bin/yjfunc bin/yjprog
即可看到“c program text”。该程序设计前还有几个难点:
1 终端立即响应方式(即每键入一个字符,程序都能响应并处理)。
2 二维或多维数组在sh中实现的方式、操作的办法。
3 特殊显示方式(如反显)。
4 字符串的定位、定长输入和显示。
5 开辟指定区域的滚动区、记录的增、删、改、定位技术。
6 系统的控制字符的处理。
经过一段时间的摸索,上述问题都已妥善解决。接下来的便是考虑程序的模块化、易读性、易维护性。最后附上源码:
/***主程序:qtyj***/
trap '' 0 1 2 3 5
DL=_
. $HOME/bin/yjfunc
. $HOME/bin/yjprog
fxbar()
{
if [ $3 -eq 0 ]
then
if [ $4 -eq 1 ]
then
v_color 1
eval v_xy $"itemx$1" $"itemy$1"
eval echo $"itemcont$1"
v_color 0
else
eval v_xy $"itemx$1" $"itemy$1"
eval echo $"itemcont$1"
fi
else
if [ $4 -eq 1 ]
then
v_color 1
eval v_xy $"barx$1$DL$2" $"bary$1$DL$2"
eval echo $"barcont$1$DL$2"
v_color 0
else
eval v_xy $"barx$1$DL$2" $"bary$1$DL$2"
eval echo $"barcont$1$DL$2"
fi
v_cln 21
v_xy 21 2
eval echo $"barts$1$DL$2"
fi
}
dispbar()
{
eval tj=$"MAXBAR$i"
[ X$tj = X ]&&return
visual=1
j=1
while [ $j -le $tj ]
do
eval v_xy $"barx$i$DL$j" $"bary$i$DL$j"
eval echo $"barcont$i$DL$j"
j=`expr $j + 1`
done
eval j=$"dqj$i"
fxbar $i $j $visual 1
}
xtcsh()
{
clear
v_box 1 1 24 80
v_xy 2 35
echo "前台应急系统"
v_line 3 2 3 79
v_line 22 2 22 79
[ "$1" = "1" ]&&{
eval `grep -v "^#" $HOME/bin/yjmenu|awk 'BEGIN{FS="|"}
{
printf "itemcont%d=%s;itemx%d=%d;itemy%d=%d
",$1,$2,$1,$3,$1,$4
}
END{printf "MAXITM=%d
",NR}'`
eval `grep -v "^#" $HOME/bin/yjbar|awk 'BEGIN{FS="|";getline
i=$1;j=$2;maxln=$4;printf "dqj%d=1
",$1
printf "barcont%d_%d=%s;barx%d_%d=%d;bary%d_%d=%d;barts%d_%d=%s;barprog%d_%d="%s"
",i,j,$3,i,j,$4,i,j,$5,i,j,$6,i,j,$7
}
{
if($1!=i)
printf "MAXBAR%d=%d;dqj%d=1
",i,j,$1
if($4>maxln)
maxln=$4
i=$1;j=$2
printf "barcont%d_%d=%s;barx%d_%d=%d;bary%d_%d=%d;barts%d_%d=%s;barprog%d_%d="%s"
",i,j,$3,i,j,$4,i,j,$5,i,j,$6,i,j,$7
}
END{printf "MAXBAR%d=%d;MAXLN=%d
",i,j,maxln}'`
}
x=1
while [ $x -le $MAXITM ]
do
eval v_xy $"itemx$x" $"itemy$x"
eval echo $"itemcont$x"
x=`expr $x + 1`
done
v_line 5 2 5 79
v_xy 23 10
echo "请用光标键、空格键和数字键选择,回车确认,h帮助,r清屏,Esc键退出c"
}
#main()
hfxjc $0||exit
cd $HOME
xtcsh 1
i=1;j=0;visual=0
t_mode 1
fxbar $i $j $visual 1
while true
do
v_xy 23 73;i_chr ch
case $ch in
QT)[ $visual -eq 0 ]&&break;visual=0;v_cbk 6 $MAXLN;v_cln 21;;
SP)fxbar $i $j $visual 0
if [ $visual -eq 0 ]
then
if [ $i -ge $MAXITM ]
then
i=1
else
i=`expr $i + 1`
fi
fxbar $i $j $visual 1
else
j=`expr $j + 1`
eval [ $j -gt $"MAXBAR$i" ]&&j=1
eval dqj$i=$j
fxbar $i $j $visual 1
fi;;
DW)
if [ $visual -eq 0 ]
then
continue
else
fxbar $i $j $visual 0
j=`expr $j + 1`
eval [ $j -gt $"MAXBAR$i" ]&&j=1
eval dqj$i=$j
fxbar $i $j $visual 1
fi;;
UP)
if [ $visual -eq 0 ]
then
continue
else
fxbar $i $j $visual 0
j=`expr $j - 1`
[ $j -lt 1 ]&&eval j=$"MAXBAR$i"
eval dqj$i=$j
fxbar $i $j $visual 1
fi;;
LF)
if [ $visual -eq 0 ]
then
fxbar $i $j $visual 0
if [ $i -le 1 ]
then
i=$MAXITM
else
i=`expr $i - 1`
fi
fxbar $i $j $visual 1
else
v_cbk 6 $MAXLN
fxbar $i $j 0 0
if [ $i -le 1 ]
then
i=$MAXITM
else
i=`expr $i - 1`
fi
fxbar $i $j 0 1
dispbar
fi;;
RG)
if [ $visual -eq 0 ]
then
fxbar $i $j $visual 0
if [ $i -ge $MAXITM ]
then
i=1
else
i=`expr $i + 1`
fi
fxbar $i $j $visual 1
else
v_cbk 6 $MAXLN
fxbar $i $j 0 0
if [ $i -ge $MAXITM ]
then
i=1
else
i=`expr $i + 1`
fi
fxbar $i $j 0 1
dispbar
fi;;
[1-9])
if [ $visual -eq 0 ]
then
[ $ch -eq $i -o $ch -gt $MAXITM ]&&continue
fxbar $i $j $visual 0;i=$ch;fxbar $i $j $visual 1
else
eval [ $ch -eq $j -o $ch -gt $"MAXBAR$i" ]&&continue
fxbar $i $j $visual 0;j=$ch
eval dqj$i=$j;fxbar $i $j $visual 1
fi;;
ET)
if [ $visual -eq 1 ]
then
eval tmpprog=$"barprog$i$DL$j"
[ "$tmpprog" = "" ]&&continue
eval $tmpprog 2>/dev/null
case $tmpprog in
help*|plbk)dispbar;;
esac
else
dispbar
fi;;
h|H)help;[ $visual -eq 1 ]&&dispbar;;
r|R)t_mode 0;xtcsh;fxbar $i $j 0 1;[ $visual -eq 1 ]&&dispbar;t_mode 1;;
esac
done
t_mode 0
clear
/***公用子函数:yjfunc***/
TTY=`tty`
v_color()
{
case $1 in
1)echo "