2010-09-08 49 views
6

我应该使用什么函数来在C中为shell命令参数转义字符串?C函数为shell命令参数转义字符串?

  1. 我有一个字符串:

    This is a string with() characters

  2. 这将是错误:

    echo This is a string with() characters

  3. 这些都是OK:

    echo "This is a string with() characters"

    echo This is a string with \(\) characters

是否有预定义的函数转换#2#3用C?

回答

6

'\''替换'的所有实例,然后将整个字符串用单引号括起来(')是一种安全的方法。即使嵌入换行符也可以使用。另一种方法是在每个字符之前插入\,除了那么你必须对换行符做一些特殊处理,因为\后跟一个换行符被shell忽略,而不被视为字面换行符。你必须用'(单引号)围住换行符。

+1

用字符串试试这个:a'b。对于我来说,echo'a \'b'....在bash中不起作用,但是回声'a''''''''...... – 2014-01-03 17:55:26

+1

@ErikAronesty:我说要用' '\''',而不是'\''。 – 2014-01-03 18:45:59

+0

请注意,引用'''产生''''''',这实际上是一串三个字符串,它们在评估中被附加。因此这不是真实的引用。 – ManuelSchneid3r 2017-04-02 15:35:10

1

没有预先定义,哪些字符需要转义取决于你的shell。查看你的shell的文档,并用\ X替换每个X.如果您所在的字符串包含“”,则使用双引号“将需要相同的处理”。

另外请注意,这会变得更加复杂,如果你要封装更复杂的表达式(任何与复合“;”等)

0

你的3.第二个版本是很容易,不是吗?

printf("\"%s\"", your string); 
+3

这打破的情况下,该字符串包含引号('“')。 – 2010-09-08 15:09:31

2

没有预定义的功能。

不过,我相信这是足以只是附上任何shell参数在单引号,并确保单引号转义。

这是在PHP中escapeshellarg功能的逻辑,我相信它的性能非常好。

+0

在外壳的情况下注意,单或双引号qouting之间的型差分。用双引号[你要逃避$和'也是如此](https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html#Double-Quotes)。 – ManuelSchneid3r 2017-04-02 15:27:38

+0

请注意,shell不允许在单引号字符串中使用单引号。 – ManuelSchneid3r 2017-04-02 15:30:44

1

C不是我选择的语言,但这里是我想出了(必须回答同样的问题,我自己)。

#include <stdio.h>  // sprintf 
#include <stdlib.h> // malloc 
#include <string.h> // strlen 

char* escapeshellarg(char* str) { 
    char *escStr; 
    int i, 
     count = strlen(str), 
      ptr_size = count+3; 

    escStr = (char *) calloc(ptr_size, sizeof(char)); 
    if (escStr == NULL) { 
     return NULL; 
    } 
    sprintf(escStr, "'"); 

    for(i=0; i<count; i++) { 
     if (str[i] == '\'') { 
        ptr_size += 3; 
      escStr = (char *) realloc(escStr,ptr_size * sizeof(char))); 
      if (escStr == NULL) { 
       return NULL; 
      } 
      sprintf(escStr, "%s'\\''", escStr); 
     } else { 
      sprintf(escStr, "%s%c", escStr, str[i]); 
     } 
    } 

    sprintf(escStr, "%s%c", escStr, '\''); 
    return escStr; 
} 

鉴于escape'this',它将输出'escape'\''this'\''',然后可以传递给echo

$ echo 'escape'\''this'\''' 
escape'this' 
+0

是不是重新分配运营成本?我记得有可能把整个字符串复制到一个新的地方。在开始时分配2 * str_size会更好。你不会经常使用很多'''的参数,但仍然... – NickSoft 2013-04-10 07:59:20

相关问题