Chinaunix

标题: [原创]在SCO的ksh下控制字符串输入的shell(基本能处理双字节字符) [打印本页]

作者: lvgq2001    时间: 2007-08-06 15:25
标题: [原创]在SCO的ksh下控制字符串输入的shell(基本能处理双字节字符)
  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 编辑 ]
作者: hncdtm    时间: 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
作者: lvgq2001    时间: 2007-08-08 09:44
怎么反响这么差呢,是不是大家都不再使用SCO系统了?
的确SCO对新硬件的支持太差,现在新购的PCServer一般都很难或者
不可能成功安装OpenServer5.0.6及以下的相对较成熟稳定的版
本,因此多数测曾经大量使用OpenServer的单位都转而用其他了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2