Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1609269
  • 博文数量: 245
  • 博客积分: 10378
  • 博客等级: 上将
  • 技术积分: 2571
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 08:19
文章分类

全部博文(245)

文章存档

2013年(4)

2012年(8)

2011年(13)

2010年(68)

2009年(152)

分类: LINUX

2009-04-08 12:14:41

   在使用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切割出的命令

}

阅读(2217) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

tastesweet2009-09-01 11:41:20

没有了,这已经很详细了

chinaunix网友2009-08-31 12:10:54

详细点的有没有啊?

chinaunix网友2009-08-31 12:10:52

详细点的有没有啊?

chinaunix网友2009-08-31 12:10:46

详细点的有没有啊?