0

私は現在、基本的なエディター用の新しいプロジェクト生成を追加するためのスクリプトに取り組んでいます。ユーザーが選択した言語に従って正しい基本プログラム (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; }

ただし、行 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;
}

それがエコーまたは評価の問題なのか、それともポインターのような問題を回避する方法があるのか​​ どうかはまだわかりません。どんなアドバイスも大歓迎です!

4

1 に答える 1

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
于 2013-02-09T13:31:32.173 に答える