2015-11-08 98 views
0
#define SHELLSCRIPT "\ 
#/bin/bash \n\ 
awk 'BEGIN { FS=\":\"; print \"User\t\tUID\n--------------------\"; } { print $1,\"\t\t\",$3;} END { print \"--------------------\nAll Users and UIDs Printed!\" }' /etc/passwd \n\ 
    " 

void displayusers() 
{ 
    system(SHELLSCRIPT); 
} 

的错误信息是:的shell在C:使用AWK得到失控字符串常量错误

awk: line 1: runaway string constant "User... 

bash的CMD运行,并在终端工作时是:

awk 'BEGIN { FS=":"; print "User\t\tUID\n--------------------"; } { print $1,"\t\t",$3;} END { print "--------------------\nAll Users and UIDs Printed!" }' /etc/passwd 

我想在某个地方使用\来阻挡各种"因为它搞砸了我的awk。但我不知道在哪里。想法?

回答

1

我只是把你的字符串,并以printf()语句中使用它,然后分析输出:

#include <stdio.h> 

#define SHELLSCRIPT "\ 
#/bin/bash \n\ 
awk 'BEGIN { FS=\":\"; print \"User\t\tUID\n--------------------\"; } { print $1,\"\t\t\",$3;} END { print \"--------------------\nAll Users and UIDs Printed!\" }' /etc/passwd \n\ 
    " 

int main(void) 
{ 
    printf("[[%s]]\n", SHELLSCRIPT); 
    return 0; 

} 

实施例运行:

$ ./runaway 
[[#/bin/bash 
awk 'BEGIN { FS=":"; print "User  UID 
--------------------"; } { print $1,"  ",$3;} END { print "-------------------- 
All Users and UIDs Printed!" }' /etc/passwd 
    ]] 
$ 

当我提出的线端可见(^J马克线的末端,^I标签),问题是透明的:

[[#/bin/bash ^J 
awk 'BEGIN { FS=":"; print "User^I^IUID^J 
--------------------"; } { print $1,"^I^I",$3;} END { print "--------------------^J 
All Users and UIDs Printed!" }' /etc/passwd ^J 
    ]]^J 

你有哪些需要是\\n字符串中两次出现\n。您是否将\t的外观更改为\\t由您决定;它以任何方式工作。

#define SHELLSCRIPT "\ 
#/bin/bash\n\ 
awk 'BEGIN { FS=\":\"; print \"User\t\tUID\\n--------------------\"; } { print $1,\"\t\t\",$3;} END { print \"--------------------\\nAll Users and UIDs Printed!\" }' /etc/passwd\n" 

使用,在我的程序产生:

[[#/bin/bash^J 
awk 'BEGIN { FS=":"; print "User^I^IUID\n--------------------"; } { print $1,"^I^I",$3;} END { print "--------------------\nAll Users and UIDs Printed!" }' /etc/passwd^J 
]]^J 

注意,尤其是使用的技术调试此。打印数据,以便您可以精确地看到它。

0

没有测试过,但这里有一个有用的看,文章just about this topic和这样看来,你的选择是沿着以下的说法:

  • ,如果您有文字周围有不同的报价,你不需要跳过内部
  • 你可以使用相同的引号围绕和逃离内部的
  • 你可以使用八进制序列作为引号,例如< \ 42>
  • ,如果它得到的太混乱,将字符串转换成一个单独的文件,其中引用将不再是一个问题