Myshell解析器

功能:实现shell命令的解析,能够将命令行输入内容进行解析。获取命令名称、参数并对重定向符进行解析

例如:

若命令行输入为:ls -al

则应解析出:命令为-ls,参数为--al

若命令行输入内容为:ls - al > out

则应该解析出:命令行为-ls,参数为---al,重定向输出文件为:out

#include <stdio.h>
#include <string.h>

#define MAXARG 8//参数最多包含的字符数
#define MAX 1024//用来接收用户输入的数组大小
#define MAXCMD 16//命令最多包含的字符数

typedef struct command
{
	char *argv[MAXARG];
	char *in,*out;
}cmd_t;

int parse(char *buf,cmd_t *cmdp)
{
	char *tmp = buf;
	char *curcmd = NULL;
	int cmdnum = 0, i = 0, j = 0;
	if((cmdp[i].argv[0] = strtok(tmp,"|")))
	{
		cmdnum++;
	}
	while((cmdp[cmdnum].argv[0] = strtok(NULL,"|")))
	{
		cmdnum++;
	}
	for(i = 0; i < cmdnum; i++)
	{
		curcmd = cmdp[i].argv[0];
		cmdp[i].in = cmdp[i].out = NULL;
		while(*curcmd)
		{
			if(*curcmd == ' ')
			{
				*curcmd++ =  '\0';
				continue;
			}
			if(*curcmd == '<')
			{
				*curcmd = '\0';
				while(*(++curcmd) == ' ');
				cmdp[i].in = curcmd;
				if(*curcmd == '\0')
					return -1;
				continue;
			}
			if(*curcmd == '>')
			{
				*curcmd = '\0';
				while(*(++curcmd) == ' ');
				cmdp[i].out = curcmd;
				if(*curcmd == '\0')
					return -1;
				continue;
			}
			if(*curcmd != ' ' &&((curcmd == cmdp[i].argv[0]) || (*(curcmd - 1) == '\0')))
			{
				cmdp[i].argv[j++] = curcmd++;
				continue;
			}
			curcmd++;
		}
		cmdp[i].argv[j] = NULL;
		j = 0;
	}
	return cmdnum;
}

void show(cmd_t *cmdp,int cmdnum)
{
	int i,j;
	for(i = 0; i < cmdnum; i++)
	{
		printf("cmd_show:%s",cmdp[i].argv[0]);
		for(j = 1;cmdp[i].argv[j]; j++)
			printf("argv: %s",cmdp[i].argv[j]);
		
		printf("\nin: %s,out: %s\n",cmdp[i].in,cmdp[i].out);
	}
}

int main(void)
{
	char buf[MAX];
	int cmdnum;
	cmd_t cmd[MAXCMD];
	while(1)
	{
		printf("sh%%");
		fflush(stdout);
		fgets(buf,MAX,stdin);
		if('\n' == buf[strlen(buf) - 1])
			buf[strlen(buf) - 1] = '\0';
		if(!strcmp(buf,"exit"))
			break;
		cmdnum = parse(buf,cmd);
		show(cmd,cmdnum);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值