免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3091 | 回复: 5
打印 上一主题 下一主题

B Shell实现光带选择菜单 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-24 00:15 |只看该作者 |倒序浏览
用UNIX B Shell实现光带选择菜单,有谁还有更好的办法吗?

:
#-------光带菜单--2000.9.1--------------------
SSTTY=`stty -g`
ESC=''  #ESC键
tput init
SM=`tput smso`
RM=`tput rmso`
AA_A_A=" A 我的业务 (Bxdo.....)";AA_B_F="sfbxdo"    #菜单项;执行命令
BB_A_B=" B 终端管理 (Tty......)";BB_B_F="sfkish"
CC_A_C=" C 关闭系统 (Shutdown.)";CC_B_F="sfshut"
DD_A_D=" D 重新启动 (Reboot...)";DD_B_F="sfboot"
EE_A_E=" E 操作系统 (System...)";EE_B_F="nssff"
FF_A_F=" F 其    他 (Other....)";FF_B_F="ccddm"
GG_A_G=" G 退    出 (Exit.....)";GG_B_F="exit"

AA_A="`tput cup 10 25`${AA_A_A}"     # 菜单定位
BB_A="`tput cup 11 25`${BB_A_B}"
CC_A="`tput cup 12 25`${CC_A_C}"
DD_A="`tput cup 13 25`${DD_A_D}"
EE_A="`tput cup 14 25`${EE_A_E}"
FF_A="`tput cup 15 25`${FF_A_F}"
GG_A="`tput cup 16 25`${GG_A_G}"

AA_B="`tput cup 10 25`${SM}${AA_A_A}${RM}"     #高亮菜单定位
BB_B="`tput cup 11 25`${SM}${BB_A_B}${RM}"
CC_B="`tput cup 12 25`${SM}${CC_A_C}${RM}"
DD_B="`tput cup 13 25`${SM}${DD_A_D}${RM}"
EE_B="`tput cup 14 25`${SM}${EE_A_E}${RM}"
FF_B="`tput cup 15 25`${SM}${FF_A_F}${RM}"
GG_B="`tput cup 16 25`${SM}${GG_A_G}${RM}"

CCDD='X1'
trap "stty echo;stty icanon;stty $SSTTY;exit" 1 2 3 15
tput clear
cat <<HELLO
`tput cup 5 1`   #从第5排开始显示
                  
                            UNIX系统管理

             ┏━━━━┯━━━━━━━━━━━━┯━━━━┓
             ┃        │${AA_A_A}│        ┃
             ┃        │${BB_A_B}│        ┃
             ┃        │${CC_A_C}│        ┃
             ┃        │${DD_A_D}│        ┃
             ┃        │${EE_A_E}│        ┃
             ┃        │${FF_A_F}│        ┃
             ┃        │${GG_A_G}│        ┃
             ┠────┴────────────┴────┨
             ┃                                         ┃
             ┗━━━━━━━━━━━━━━━━━━━━━━┛
HELLO

while true
do
[ "$CCDD" = "" ] && CCDD=""      #光标键选择
[ "$CCDD" = "" ] && {
        SUM=`expr $SUM - 1`
        [ $SUM -eq 0 ] && SUM=7
        CCDD="X$SUM"
        }
[ "$CCDD" = "" ] && CCDD=""
[ "$CCDD" = "" ]  && {
        SUM=`expr $SUM + 1`
        [ $SUM -eq 8 ] && SUM=1
        CCDD="X$SUM"
        }
DDOO="Y$SUM"
case $CCDD in
        X1 ) echo "$GG_A$AA_B$BB_A";;
        X2 ) echo "$AA_A$BB_B$CC_A";;
        X3 ) echo "$BB_A$CC_B$DD_A";;
        X4 ) echo "$CC_A$DD_B$EE_A";;
        X5 ) echo "$DD_A$EE_B$FF_A";;
        X6 ) echo "$EE_A$FF_B$GG_A";;
        X7 ) echo "$FF_A$GG_B$AA_A";;
        '' ) stty echo
             stty icanon
             stty $SSTTY
             tput cup 22 2
             case $DDOO in
                    Y1 ) $AA_B_F
                        CCDD='X1';;
                   Y2 ) $BB_B_F
                        CCDD='X2';;
                   Y3 ) $CC_B_F
                        CCDD='X3';;
                   Y4 ) $DD_B_F
                        CCDD='X4';;
                   Y5 ) $EE_B_F
                        CCDD='X5';;
                   Y6 ) $FF_B_F
                        CCDD='X6';;
                   Y7 ) break 2;;
                    * ) CCDD='X7';;
             esac
             continue 2;;
         * ) stty echo
             stty icanon
             stty $SSTTY
             tput cup 22 2
             case $CCDD in
                  a|A ) $AA_B_F
                        CCDD='X1'
                        SUM=1;;
                  b|B ) $BB_B_F
                        CCDD='X2'
                        SUM=2;;
                  c|C ) $CC_B_F
                        CCDD='X3'
                        SUM=3;;
                  d|D ) $DD_B_F
                        CCDD='X4'
                        SUM=4;;
                  e|E ) $EE_B_F
                        CCDD='X5'
                        SUM=5;;
                  f|F ) $FF_B_F
                        CCDD='X6'
                        SUM=6;;
                  g|G|q|Q ) break 2;;
                      * ) CCDD='X7'
                              SUM=7;;
              esac
              continue 2;;
esac
CCDD=
ccdd_a=
ccdd_b=
stty -icanon   #消除回车
stty min 1
stty time 0
stty -echo
ccdd_a=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
[ "$ccdd_a" = "$ESC" ] && ccdd_b=`dd if=/dev/tty bs=1 count=2 2>/dev/null`  #光标键选择处理
CCDD="$ccdd_a$ccdd_b"  
stty icanon
stty $SSTTY
done
done 2>/dev/null

论坛徽章:
0
2 [报告]
发表于 2004-02-24 00:53 |只看该作者

B Shell实现光带选择菜单

把put定位光标改用echo -n "\\033[x;yH",我想效率是不是高些呢?! 望赐教 ^_^

论坛徽章:
0
3 [报告]
发表于 2004-02-24 19:40 |只看该作者

B Shell实现光带选择菜单

我认为影响不大,因为tput的值已经赋值一个变量了,这个变量的值同echo所得的结果效果应该是一样的。

echo执行远没有<<快。
cat<<HELLO
... ...
HELLO

论坛徽章:
0
4 [报告]
发表于 2004-02-24 20:22 |只看该作者

B Shell实现光带选择菜单

兄弟发个压缩包上来吧,这个里面有的控制字符变了

论坛徽章:
0
5 [报告]
发表于 2004-02-24 20:33 |只看该作者

B Shell实现光带选择菜单

2000年我设计软件中的其中一个文件,这个程序没有调用菜单接口,我想讨论一下方法问题,我不知道这个论坛怎么上传压缩文件,下面图片下载后去除扩展名.jpg即可。
     
     这是一个纵向的菜单,用此方法也可做一个横向菜单,或两种相间的菜单,便于改善Shell程序单调的界面。

nsfsh.jpg

4.55 KB, 下载次数: 823

论坛徽章:
0
6 [报告]
发表于 2004-02-24 21:25 |只看该作者

B Shell实现光带选择菜单

不错!!明天试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP