2015-04-03 62 views
0

我需要将以下例句保存为名为demo.sh的文件。如何正确转义嵌套特殊字符

#!/usr/bin/env bash 
xmessage This is "first sentence" 
xmessage This is 'second sentence' 
xmessage This is {third sentence} 

我在C使用代码如下:

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

int main() 
{ 
    system("sudo bash -c 'printf \"#!/usr/bin/env bash\n\" > /usr/share/applications/demo.sh'"); 
    return 0; 
} 

我可以写上述4句的第一句行到文件中。但其他句子包含特殊字符,如single quotes,double quotesline ending character。由于sudo命令需要分别包含'"的两个嵌套段,因此难以逃脱。

如何逃避句子并写出文件?有一些功能会很棒,因为实际上文件超过4个句子,并且有很多特殊字符。

作为一个说明,我知道我可以用C的I/O功能,我想通过一个单一的system命令,它使用sudoprintfone line string写入文件。

+0

使用'system'实际上与在终端中输入这些命令相同,有什么理由不这样做? – 2015-04-03 15:53:53

+0

在测试期间,程序无法写入'/ usr/share/applications /'位置,因为它属于'root'。我看到使用'sudo bash -c'方式在终端工作。所以我想把终端方式转换成C程序。对于简单的句子来说,它变得很棒,但是只要句子中包含特殊字符,它就非常复杂。 – Jessie 2015-04-03 16:06:44

+0

这不是将它移植到C,这只是通过C程序执行相同的bash命令。 – 2015-04-03 16:10:00

回答

0

我不件事,它的最佳方式,但您可以使用一个的char []的系统命令和sprintf()函数的变量分裂和在此变量

这里写命令是一个例子

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

int main() 
{ 
    char command[128]; 

    /* Generate string */ 
    sprintf(command, "sudo bash -c %s %s bash\n > /usr/share/applications/demo.sh'", 
     "'printf", "#!/usr/bin/env"); 

    system(command); 
    return 0; 
} 
+0

感谢您的提示。我修改了你的代码,但每当我去第二行时,它看起来都很糟糕。我不得不使用3个反斜杠作为第二句双引号转义。 'sprintf(command,“sudo bash -c%s%s> /usr/share/applications/demo.sh'”, “'printf”,“\”#!/ usr/bin/env \\ nxmessage这是\\\“第一句\\\”\“”);' – Jessie 2015-04-03 16:43:38

+0

我不确定为什么需要3个反斜杠。 – Jessie 2015-04-03 16:46:28