在使用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切割出的命令
}
|
阅读(2263) | 评论(4) | 转发(0) |