免费注册 查看新帖 |

Chinaunix

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

如何在命令行模式下实现自动补齐? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-08 10:02 |只看该作者 |倒序浏览
本帖最后由 oniziga 于 2012-03-08 10:02 编辑

大家好,我是shell新手,有个问题请教一下。
公司的产品是基于linux开发的,在linux下作了相应的命令行接口,比如进入./qcommand命令模式下,就可以在该模式下进行命令自动补齐,完全类似于bash的实现。
现在的问题是,我想自己写个shell脚本,然后在该脚本中进入./qcommand模式,然后再模拟一个自动补齐的功能,基本思路是:

1) 先把./qcommand模式下的所有命令都导出到一个文件里,比如/tmp/help;
2) 在不回车的情况下,判断输入的字符,如果是一般的字符,就把该字符存到一个全局变量model,如果是tab键,就在/tmp/model中对model进行匹配,输出首字符串以model开头的;如果是回车键,则把model对应的帮助信息输出(可以通过类似echo "$model -h"实现);

大家是否做过类似的工作,有没有好的建议给我?谢谢了。

论坛徽章:
0
2 [报告]
发表于 2012-03-08 11:45 |只看该作者
http://bbs.chinaunix.net/thread-933453-1-1.html


我就记得好像readline可以做

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2012-03-08 15:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2012-03-08 15:53 |只看该作者
谢谢上面的,不过似乎你们理解错误了。
我的意思是./qcommand后可以进入公司开发的命令行模式,在该模式下已经可以实现自动补齐功能。

我想单独写shell脚本,在该脚本里实现./qcommand模式下的自动补齐。

论坛徽章:
0
5 [报告]
发表于 2012-03-08 18:04 |只看该作者
本帖最后由 oniziga 于 2012-03-08 18:05 编辑

#!/bin/bash                             
get_char()                              
{                                       
SAVEDSTTY=`stty -g`                     
                                       
#stty -echo                             
stty raw                                
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw                              
stty $SAVEDSTTY                        
}                                      
                                       
function match_model() {                     
                                             
echo " "                                      
echo "=======all command fitted======="      
awk '/^'$model'/ {print}' /tmp/help           
echo "================================"      
echo -n "$model"                              
                                             
}                                             
                                             
function delete_last_char() {                 
                                             
model=`echo $model | cut -c1-$((${#model}-1))`
                                         
}                                       
                                         
function enter_model() {                 
                                         
if [ $model == "gogo" ]                  
then                                    
    return 1                             
else                                    
   echo "print the mannual of the $model"
   return 0                     
fi                              
                                
}                              
model=''                        
echo "Please input the command:"
while [ 1 ]         
do                  
current=`get_char`   
case $current in     
'^M')               
    enter_model      
    ok=$?            
    if [[ $ok == 1 ]]
    then            
       break            
    fi                  
    model='';;           
'       ')               
    match_model         
    ;;                       
'^H')               
    delete_last_char
   ;;               
'q')                 
    exit                 
    ;;                  
*) model="$model$current"
esac                     
done   

论坛徽章:
0
6 [报告]
发表于 2012-03-08 18:09 |只看该作者
上面的脚本写的比较挫,编程经验少,shell也没学,一边查资料一边写的。

目前存在两个问题:

1)function delete_last_char() 这个函数有点问题,似乎不能删除最后的字符,比如model为“mv“,那么按两次^H时,最后的”m“删不掉;
2)敲回车,删除的时候,不能在终端上直接回车或者删除字符,显示^M和^H。 估计要在那个stty上面想一想。

论坛徽章:
0
7 [报告]
发表于 2012-03-08 18:11 |只看该作者
学习

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2012-03-08 18:23 |只看该作者
是哪种自动补齐?

论坛徽章:
0
9 [报告]
发表于 2012-03-09 10:37 |只看该作者
回复 3# zooyo


    换句话说,在shell里,怎么可以实现同时:

1)用backspace键删除终端的字符;
2)在删除字符的同时,在后台删除变量里的最后一个字符?

论坛徽章:
0
10 [报告]
发表于 2012-03-09 22:54 |只看该作者
哇哈哈,
终于搞定了,虽然程序比较挫,但还是达到了期望。
下周发出来分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP