功能:实现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;
}