编写我自己的基本shell:处理双引号参数

时间:2013-12-15 01:41:42

标签: c shell double-quotes

我正在开发一个基本的unix shell,我很自豪地说它工作得很棒我在整个开发过程中学到了很多东西。有一个我缺少的功能,我似乎无法绕过如何让它工作,也许我的大脑被烧毁了。

如果我收到以下输入:

回声“Hello World”

我需要解析输入,以便双引号参数被认为是命令的一个参数,而不是两个单独的参数。

我想要实现这个的方法是,我需要一种方法来检测参数中是否有2个引号。如果我们找到它们,我们将需要一个单独的解析函数来处理它们。

我已经包含了我的解析函数,因为我认为这是魔术需要发生的地方。非常感谢任何建议。

//parse
char ** parse(char *input){
   char *token;
   char **args;
   args = malloc (MAX_SIZE*sizeof(char));
   int i = 1;
   token = strtok(input, " \n\t()<>|&;");
   args[0] = token; //this is the command

   token = strtok(NULL, " \n\t()<>|&;");
   while (token != NULL){
       args[i] = token; // these are the arguments
       i++;
       token = strtok(NULL, " \n\t()<>|&;");

   }
   args[i] = NULL; //end the array with NULL (required for execvp)
   return args;
}

1 个答案:

答案 0 :(得分:0)

我建议不要在parse函数中嵌入ad-hoc词法分析器,而是使用lex等生成一个,或者2)手动编码。如果您使用基于正则表达式的词法分析器生成器,则可以使用"[^"]*"之类的规则将双引号字符串作为单个标记。如果您希望能够使用反斜杠来转义双引号,则可以使用"(\.|[^\"])*"之类的规则。