免费注册 查看新帖 |

Chinaunix

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

[原创]在ksh环境下控制字符串输入的脚本 [复制链接]

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

[ 本帖最后由 lvgq2001 于 2007-8-12 19:45 编辑 ]

getstr.tar

5 KB, 下载次数: 56

在ksh环境下控制字符串输入的脚本

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-08-06 16:06 |只看该作者
不错~~, 支持原创! ^_^

论坛徽章:
0
3 [报告]
发表于 2007-08-06 16:34 |只看该作者
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP