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,这样 heredoc 中的任何变量都不会被扩展。
  • 转义分号
  • 添加-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 回答