shell中的C:使用awk获取失控字符串常量错误

时间:2015-11-08 04:16:39

标签: c linux bash awk

#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);
}

错误消息为:

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

我觉得在使用\阻止各种"来解决这个问题时,某些地方搞砸了我的问题。但我不知道在哪里。想法?

2 个答案:

答案 0 :(得分: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

请注意,特别是用于调试此技术的技术。打印数据,以便您可以准确地看到它。

答案 1 :(得分:0)

尚未经过测试,但这是一篇看似有用的文章just about this topic,看来您的选择大致如下:

  • 如果您在文本周围有不同的引号,则无需转义内部的
  • 你可以使用相同的引号并逃避内部引用
  • 您可以使用八进制序列作为引号,例如&LT; \ 42 GT;
  • 如果它太混乱,请将字符串移动到单独的文件中,引用不会成为问题