| 您的位置:首页 > 文档 > Shell > |
文章分类热门文章 |
SCO UNIX 5.0.5下通用菜单程序(用bsh制作,含源码)创建:2005-10-26 00:49:44 作者:Unlinux 来自: http://www.Unlinux.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 " 转载自:http://www.unlinux.com/doc/shell/20051026/179.html 【评论】 【加入收藏夹】 【大 中 小】 【打印】 【关闭】 ※ 相关链接 无相关信息 |