您的位置:首页 > 运维架构 > Shell

字符串切割思路--shell重定向 管道

2013-06-25 17:24 267 查看
在使用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切割出的命令

}
阅读(1273) | 评论(4) | 转发(0) |

0
上一篇:shell下,进程的前台与后台运行

下一篇:命令字符串中命令与参数的切割

相关热门文章

linux 常见服务端口

什么是shell

linux socket的bug??

linux的线程是否受到了保护?...

一个适用于windows和linux的抓...

debian7系统与ATI X2300显卡...

ubuntu sysklogd之配置文件介...

自己用的ubuntu环境搭建(一)...

linux 学习心得

用户输入操作和数据的显示...

给主人留下些什么吧!~~



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
详细点的有没有啊?
回复 | 举报

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: