- 论坛徽章:
- 0
|
在使用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 |
|