Проблемы с функцией eval, пропускающей новые строки в $(eval echo $myvar)

В настоящее время я работаю над сценарием, предназначенным для добавления нового поколения проекта для любого базового редактора. Я использую следующую структуру для создания правильной базовой программы (привет, мир) в соответствии с языком, выбранным пользователем:

#!/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; }

Однако при замене строки 13 на echo -n "$TXTMAIN_C" >> "$MAIN" это дает правильный вывод:

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

Я до сих пор не знаю, является ли это проблемой эха или eval, или есть ли способ обойти мою проблему с указателем. Любые советы очень приветствуются!


person Aserre    schedule 09.02.2013    source источник
comment
Одинарные кавычки — ваш друг. Гораздо проще написать: TXTMAIN_C='#include ... , так как вам не нужно экранировать или \.   -  person William Pursell    schedule 09.02.2013


Ответы (1)


В вашем сценарии есть несколько ошибок, и он сложнее, чем должен быть.

Если вы хотите использовать такую ​​косвенную переменную, используйте синтаксис ${!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
person Mat    schedule 09.02.2013
comment
Что ж, это было быстро... Спасибо, вы ответили именно то, что мне было нужно! - person Aserre; 09.02.2013