分享
 
 
 

SCOUNIX5.0.5下通用菜单程序(用bsh制作,含源码)

王朝system·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

笔者的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 "

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有