免费注册 查看新帖 |

Chinaunix

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

[SCO UNIX] [原创]在SCO的ksh下控制字符串输入的shell(基本能处理双字节字符) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-06 15:25 |只看该作者 |倒序浏览
  1. #!/bin/ksh
  2. # ksh环境下控制字符串输入的shell
  3. # 仙桃市农村信用合作联社 吕永辉
  4. # 调试环境SCO OpenServer 5.0.6 & Ksh
  5. getcon(){
  6. stty raw -echo
  7. TempC=`dd if=/dev/tty bs=1 count=1 2>/dev/null | od -b | sed '$d' | awk '{printf("obase=10;ibase=8;%d\n",$2)}' | bc`
  8. stty -raw
  9. echo $TempC
  10. }
  11. get_str(){ # 参数:1-长度 2-提示行 3-纵坐标 4-变量名 5-是否可空
  12. eval $4=""
  13. set -A StrT
  14. while
  15.    i=0
  16.    echo "[${3};3H`printf "%-10s[%$1s]" ${2} ' '`" > /dev/tty
  17. #   echo "[${3};13H[`printf "%$1s" ' '`]" > /dev/tty
  18.    echo "[${3};14H\c" > /dev/tty
  19.    while
  20.    [ "$i" = "$1" ] && break
  21.    stty -echo
  22.    C_Code=`getcon`
  23.     case $C_Code in
  24.      13|127) break;; # 回车、<DEL>跳出
  25.      27)stty min 0 time 1;C_Code=`getcon`;stty min 1 time 1 #处理功能键<esc>序列
  26.         [ $C_Code -eq 91 ] && {
  27.           C_Code=`getcon`
  28.           case $C_Code in
  29.             65)C_Code=27;C_Fun=Up;break;;
  30.             66)C_Code=27;C_Fun=Down;break;;
  31.             67)C_Code=27;C_Fun=Right;break;;
  32.             68)C_Code=27;C_Fun=Left;break;;
  33.             71)C_Code=27;C_Fun=PgUp;break;;
  34.             73)C_Code=27;C_Fun=PgDn;break;;
  35.             *)C_Code=13;break;;
  36.           esac
  37.                 }||{
  38.           C_Code=27;C_Fun=ESC;break
  39.                 };;
  40.      60|61|62|63|91|92|93|123|124|125) continue;; # 屏蔽限制字符
  41.     esac
  42.    [ $C_Code -eq 8 ] && {
  43.     [ i -eq 0 ] && {
  44.            echo "[${3};`expr 14 + $i`H\c" > /dev/tty
  45.         continue
  46.         }
  47.     j=`expr $i - 1`
  48.     [ "${StrT[$j]}" = "" ] && {
  49.       StrT[$i]=""
  50.       StrT[$j]=""
  51.       i=`expr $j - 1`
  52.       StrT[$i]=""
  53.       echo "[${3};`expr 14 + $i`H  \c" > /dev/tty
  54.       echo "[${3};`expr 14 + $i`H\c" > /dev/tty
  55.             }||{
  56.       StrT[$i]=""
  57.       i=`expr $i - 1`
  58.       StrT[$i]=""
  59.       echo "[${3};`expr 14 + $i`H \c" > /dev/tty
  60.       echo "[${3};`expr 14 + $i`H\c" > /dev/tty
  61.             }
  62.       continue
  63.         }
  64.      [ $C_Code -lt 43 ] && continue # 屏蔽特殊字符
  65.      StrT[$i]="`echo $C_Code| awk '{printf("%c\n",$1)}'`"
  66.      [ "${StrT[$i]}" = " " -o "${StrT[$i]}" = "" ] && continue
  67.      [ $C_Code -gt 128 ] && {
  68.         StrA=`echo -n ${StrT[$i]}`
  69.         j=`echo -n $i`
  70.         i=`expr $i + 1`
  71.         [ "$i" = "$1" ] && {
  72.         StrT[$j]=""
  73.         i=`expr $i - 1`
  74.              echo -n "[${3};`expr 14 + $j`H ]" > /dev/tty
  75.              echo "[${3};`expr 14 + $j`H\c" > /dev/tty
  76.         continue
  77.                 } || {
  78.         C_Code=`getcon`
  79.         StrT[$i]="`echo $C_Code| awk '{printf("%c\n",$1)}'`"
  80.         StrT[$j]=`echo -n ${StrA}${StrT[$i]}`
  81.         StrT[$i]=""
  82.                      }
  83.                 }
  84.      C_Str=`echo ${StrT[*]} | sed 's/ //g'`
  85.      stty echo
  86.      echo  "[${3};14H${C_Str}\c" > /dev/tty
  87.      do
  88.      i=`expr $i + 1`
  89.      done
  90. do
  91.      [ $C_Code -eq 127 -o $C_Code -eq 27 ] && {
  92.      # <del>、<esc>丢弃输入还未处理功能键序列
  93.        [ $5 -eq 1 ] && {
  94.         C_Str='';continue
  95.                 }||{
  96.         stty echo;eval $4="";break
  97.                 }
  98.         }
  99.      [ $C_Code -eq 13 ] && {
  100.        [ $5 -eq 1 -a "$C_Str" = "" ] && {
  101.         continue
  102.                 }||{
  103.         stty echo;eval $4=`echo -n $C_Str`;C_Str="";break
  104.                 }
  105.         }
  106.      [ "$i" = "$1" ] && {
  107.         stty echo;eval $4=`echo -n $C_Str`;C_Str="";break
  108.                 }
  109.      C_Str=''
  110.      set -A StrT
  111. done
  112. }
  113. # get_str 参数:1-长度 2-标题 3-纵坐标 4-变量名 5-是否可空
  114. clear
  115. conI=5
  116. get_str 2 机构号 $conI InstNo 1
  117. conI=`expr $conI + 1`
  118. get_str 1 资产主类 $conI AssetsClass 1
  119. conI=`expr $conI + 1`
  120. get_str 30 资产名称 $conI AssetsName 1
  121. conI=`expr $conI + 1`
  122. get_str 30 建筑物地址 $conI AssetsAdd 0
  123. conI=`expr $conI + 1`
  124. get_str 20 房产证号码 $conI AbstractTitle 0
  125. conI=`expr $conI + 1`
  126. get_str 20 土地证号码 $conI TenureTitle 0
  127. conI=`expr $conI + 1`
  128. get_str 10 保管人 $conI Custodian 0
  129. conI=`expr $conI + 1`
  130. get_str 60 备注 $conI Remark 0
  131. echo "\n $AssetsClass $InstNo $AssetsName \n 地址:$AssetsAdd \n 房产证号:$AbstractTitle \n土地证号:$TenureTitle 保管人:$Custodian \n 备注:$Remark"
复制代码

此脚本尚未写入响应功能键(如:方向键、F1、PgUp...等)的代码,有兴趣的朋友可以自行完善。
脚本下载地址:
http://bbs.chinaunix.net/attachment.php?aid=207768

[ 本帖最后由 lvgq2001 于 2007-8-8 09:50 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-06 20:00 |只看该作者
原帖由 lvgq2001 于 2007-8-6 15:25 发表
论坛不允许发表相同内容的帖子,我已经发在shell版了,发个连接吧。
http://bbs.chinaunix.net/thread-972342-1-1.html

http://bbs.chinaunix.net/thread-972342-1-1.html

论坛徽章:
0
3 [报告]
发表于 2007-08-08 09:44 |只看该作者
怎么反响这么差呢,是不是大家都不再使用SCO系统了?
的确SCO对新硬件的支持太差,现在新购的PCServer一般都很难或者
不可能成功安装OpenServer5.0.6及以下的相对较成熟稳定的版
本,因此多数测曾经大量使用OpenServer的单位都转而用其他了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP