我有这个:
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};};'
答案 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};};