eval函数在$(eval echo $ myvar)中跳过换行符的问题

时间:2013-02-09 13:22:17

标签: bash pointers eval echo

我目前正在制作一个脚本,旨在为任何基本编辑器添加新的项目生成。 我正在使用以下结构,以便根据用户选择的语言生成正确的基本程序(hello,world):

#!/bin/sh
#this is a short example in the case the user selected C as the language
TXTMAIN="\$TXTMAIN_C"
$TXTMAIN_C="#include <stdlib.h>
#include <stdio.h>
int main(int argc, char const* argv[])
{
    printf(\"hello, world\n\");
    return EXIT_SUCCESS;
}"
MAIN="./main.c"
touch MAIN
echo -n "$(eval echo $TXTMAIN)" >> "$MAIN"
gedit MAIN

编辑main.c时,这段代码提供了以下输出:

#include <stdlib.h> #include <stdio.h> int main(int argc, char const* argv[]) { printf("hello, world\n"); return EXIT_SUCCESS; }

但是,当用echo -n“$ TXTMAIN_C”&gt;&gt;替换第13行时“$ MAIN”,它给出了正确的输出:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char const* argv[])
{
    printf("hello, world\n");
    return EXIT_SUCCESS;
}

我仍然不知道这是一个回声或评估问题,或者是否有类似指针问题的方法。 非常欢迎任何建议!

1 个答案:

答案 0 :(得分:4)

您的脚本中存在一些错误,并且它应该比它应该更复杂。

如果您想使用这样的间接变量,请使用${!FOO}语法,并在适当的地方加上引号:

#!/bin/sh
#this is a short example in the case the user selected C as the language
TXTMAIN=TXTMAIN_C                          # don't force a $ here
TXTMAIN_C="#include <stdlib.h>
#include <stdio.h>
int main(int argc, char const* argv[])
{
    printf(\"hello, world\n\");
    return EXIT_SUCCESS;
}"
MAIN="./main.c"
echo "${!TXTMAIN}" > "$MAIN"                # overwrite here, if you want to 
                                            # append, use >>. `touch` is useless