在字符串中展开bash var

时间:2013-03-05 10:51:03

标签: bash

我有这个:

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};};'

2 个答案:

答案 0 :(得分: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}"

答案 1 :(得分: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};};