需要扩展引号中的 HEREDOC 中的变量

需要扩展引号中的 HEREDOC 中的变量

是否可以使用 HEREDOC 并在变量用引号引起来时发生变量扩展?

示例:$package 是在脚本运行前设置的环境变量

#!/bin/bash

cat > out.json <<'EOF'
{
    "apps": [
    {
        "cwd":"/usr/local/$package"
    }
}
EOF

如果 $package="www",则预期输出

{
    "apps": [
    {
        "cwd":"/usr/local/www"
    }
}

答案1

总结

使用<<EOF而不是<<'EOF'


这是 POSIX 对此处文档的说法 [重点是我的]:

[n]<<word
    here-document
delimiter

[…]

如果任何部分word被引用,分隔符应通过对 执行引号删除来形成word,并且此处文档的行不应扩展否则,分隔符应为其word本身。

如果未引用任何部分word,则此处文档的所有行均应展开以进行参数扩展、命令替换和算术扩展。 […]

在您的例子中word'EOF'(引用!),因此$package此处的文档内部未展开。删除这些引号,您将获得所需的结果。

cat > out.json <<EOF
{
    "apps": [
    {
        "cwd":"/usr/local/$package"
    }
}
EOF

请注意,这与此处文档内变量周围的引号无关。

相关内容