忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台论坛 博客 问答 文库 沙龙 自测 下载 订阅 搜索 频道自动化运维 虚拟化 服务器 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1510 | 回复: 5

请教 如何实现backspace [复制链接]

Rank: 1

帖子
332
主题
133
精华
0
可用积分
422
专家积分
0
在线时间
4 小时
注册时间
2005-12-12
最后登录
2014-07-03
论坛徽章:
0
发表于 2007-05-06 19:51:35 |显示全部楼层
经过论谈里各位大哥的指导,弄好了一个输入密码的脚本

#!/bin/ksh

S_pass=''
S_blank='false'

getchar()
{
        stty raw
        eval $1='`dd bs=1 count=1 2> /dev/null`'
        stty -raw
}

while [ "$S_blank" != "true" ]
do
        stty -echo
        getchar C_pass

        if [ -z "`echo ${C_pass} | tr -d "\015"`" ]; then
                S_blank='true'
        else
                stty echo
                echo  "*\c"
                S_pass=${S_pass}${C_pass}
                stty -echo
        fi
done
stty echo

echo [$S_pass]
基本功能都可以实现了,但是还是没有办法实现 backSpace键的功能? 有什么好一点的办法吗? 期待大家的指点!!!

[ 本帖最后由 kenancola 于 2007-5-6 19:54 编辑 ]

Rank: 2

帖子
1597
主题
14
精华
0
可用积分
1679
专家积分
0
在线时间
56 小时
注册时间
2004-12-13
最后登录
2011-04-28
论坛徽章:
0
发表于 2007-05-06 20:48:49 |显示全部楼层
以前写的一个,也是借鉴了部分前人的智慧
  1. #!/bin/bash
  2. SAVEDSTTY=`stty -g`
  3. stty -echo raw
  4. while true
  5. do
  6. readchar=`dd if=/dev/tty bs=1 count=1 2> /dev/null`
  7. case "$readchar" in
  8. ^M) stty $SAVEDSTTY
  9.         echo
  10.         break;;
  11. ^?) echo -ne "\33[1D\33[K"
  12.         passwd=${passwd%?}
  13.         continue;;
  14. *)  passwd="$passwd$readchar"
  15.         echo -n "*"
  16.         continue;;
  17. esac
  18. done
  19. echo "$passwd"
复制代码

注意^M是c-v+enter输入的,^?是c-v+backspace输入的,都是一个字符。
SUN E4500/SUN F4800/SUN V880
Solaris 8
KSH/NAWK/SED/VIM 6.3.3/perl 5.005_03

Rank: 1

帖子
332
主题
133
精华
0
可用积分
422
专家积分
0
在线时间
4 小时
注册时间
2005-12-12
最后登录
2014-07-03
论坛徽章:
0
发表于 2007-05-06 21:04:05 |显示全部楼层

谢谢楼上的

谢谢楼上的,但可否指点一下以下两句,没太看明白

echo -ne "\33[1D\33[K"
        passwd=${passwd%?}
        continue;;

谢谢了

Rank: 2

帖子
1597
主题
14
精华
0
可用积分
1679
专家积分
0
在线时间
56 小时
注册时间
2004-12-13
最后登录
2011-04-28
论坛徽章:
0
发表于 2007-05-06 21:35:44 |显示全部楼层
ANSI控制码,请看下面这篇帖子
http://bbs.chinaunix.net/viewthread.php?tid=207837
passwd=${passwd%?},去除最后一个字符,类似于perl的$passwd = chop $passwd;
SUN E4500/SUN F4800/SUN V880
Solaris 8
KSH/NAWK/SED/VIM 6.3.3/perl 5.005_03

Rank: 1

帖子
332
主题
133
精华
0
可用积分
422
专家积分
0
在线时间
4 小时
注册时间
2005-12-12
最后登录
2014-07-03
论坛徽章:
0
发表于 2007-05-06 22:35:10 |显示全部楼层
感激啊! 原来还可以这样用的,我原以为要用tput的,后来又不知道应该怎么操作,因为不知道当前运行时我的光标的坐标啊,正发愁呢,谢谢了!

Rank: 1

帖子
332
主题
133
精华
0
可用积分
422
专家积分
0
在线时间
4 小时
注册时间
2005-12-12
最后登录
2014-07-03
论坛徽章:
0
发表于 2007-05-06 23:10:19 |显示全部楼层
我晕,我用的是aix的Ksh。不能用啊!!! 有什么办法解决吗? 我平时用 echo 打控制字符是不用
-e 的, 我只要 echo "k\te\c" 就可以实现相应的功能,可是为什么我加这些控制字符一点用都没有啊???
您需要登录后才可以回帖 登录 | 注册

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP