1

私はこれを持っています:

read -d '' foo <<-EOF
FOO "${filename}" BAR {\
\       FOO BAR FOO {BAR};\
\       FOO BAR FOO {BAR};\
};
EOF

filename="bar";

eval echo $foo;

すでにお察しのとおり、$foo 内で $filename を展開しようとしています。

私は何を間違っていますか?

編集:

私が得ているエラー:

./test.sh: eval: line 10: syntax error near unexpected token `}'
./test.sh: eval: line 10: `echo FOO "" BAR { FOO BAR FOO {BAR}; FOO BAR FOO {BAR};};'
4

2 に答える 2

2

私はあなたがやろうとしていることは可能ではないと思います(更新:受け入れられた答えを読んでください;)。これは、evalコマンドで$foo有効なbash構文が含まれている必要があるためです。

代わりにbashの文字列操作演算子を使用します$filename

#!/bin/bash

read -d '' foo <<'EOF'
FOO "$filename" {
       FOO BAR FOO BAR;
       FOO BAR FOO BAR;
};
EOF

filename="bar";

echo "${foo/\$filename/$filename}"

filename="bar2";

echo "${foo/\$filename/$filename}"
于 2013-03-05T11:16:28.177 に答える
2

次のことを行う必要があります。

  • EOFヒアドキュメント内の変数が展開されないように、単語を引用符で囲みます。
  • セミコロンをエスケープする
  • -rにオプションを追加して、readバックスラッシュをエスケープ文字として扱わないようにします

これを試して:

read -r -d '' foo <<-"EOF"
FOO "${filename}" BAR {\
\       FOO BAR FOO {BAR}\;\
\       FOO BAR FOO {BAR}\;\
}\;
EOF

filename="bar"

eval echo "$foo"

出力:

FOO bar BAR {  FOO BAR FOO {BAR};  FOO BAR FOO {BAR};};
于 2013-03-05T11:29:33.223 に答える