免费注册 查看新帖 |

Chinaunix

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

字符串切割思路--shell重定向 管道 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-08 12:14 |只看该作者 |倒序浏览
   在使用shell时,有是有会用到非常复杂的命令组,往往带有重定向、管道等操作,这里讨论的是如何将这些字符串分开,分割成单个的命令。比较复杂命令如下:

ls -al | more > 1.txt
ls -al | more >> 1.txt
more  ls -al
可以看出,在shell中,所有的命令组或者命令串都有一个共同的特点,那就是所有的命令串都是通过字符'|'、'、'>>'来连接的,而事实上,bash支持的连接符基本上就上边三个,那么我们就可以通过这些字符来分割开单个的命令。
  第一步,要判断输入的字符串是单个命令还是一个命令串,只要通过判断是否有'|'、''、'>>'出现。
if( strpbrk(tmp,"|")==0 ) // signle
    {  // ANSI C中的库函数还是很好用的,熟悉操作这些库函数可以简化代码量
    }

这样操作后,切割命令就可以通过判断上边的三个特殊字符来完成,这里需要做一些检错工作,因为对于一个命令串,信息流入的端口只能有一个,要么是stdin,要么是输入重定向,无论何种情况,输入重定向符号
char ch,str_p[LEN],*p=str_p;
int i=strlen(p_tmp);  //p_tmp为输入待切割字符串指针
while( (i--)>0 ) //通过i来检测是否到字符串尾部
{
    while( ( ( (ch=*p_tmp++)==' ')||(ch=='|')||(ch=='>')||(ch==') )&&(i--) ); // skip space //忽略空格和其他字符
    while( (ch!='|')&&(ch!='\n')&&(ch!=')&&(ch!='>')&&(i--) )
    {
        (*p++)=ch;
        ch=*(p_tmp++);  //获得字符,直到出现特殊字符
    }
    *p='\0';
    tag_tmp=tag;
    // insert | > >>
    if( ch=='|')   //判断特殊字符的类型
    tag='|';
    else if( ch==' )
    tag=';
    else if( ch=='>'&&(ch=*p_tmp)=='>' )
    tag='a';  //  字符>>  标记为a,
    else if( ch=='>'&&(ch=*p_tmp)!='>' )
    tag='>';
    else
    tag=' ';
    p=str_p;
这里save切割出的命令
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94039/showart_1893624.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP