2015-04-03 36 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