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

Aar*_*ron 2 bash environment-variables

当变量用引号引起来时,是否可以使用 HEREDOC 并进行变量扩展?

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

#!/bin/bash

cat > out.json <<'EOF'
{
    "apps": [
    {
        "cwd":"/usr/local/$package"
    }
}
EOF
Run Code Online (Sandbox Code Playgroud)

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

{
    "apps": [
    {
        "cwd":"/usr/local/www"
    }
}
Run Code Online (Sandbox Code Playgroud)

Kam*_*ski 5

长话短说

\n

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

\n
\n

这就是 POSIX 关于此处文档的说法 [强调我的]:

\n
\n
[n]<<word\n    here-document\ndelimiter\n
Run Code Online (Sandbox Code Playgroud)\n

[\xe2\x80\xa6]

\n

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

\n

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

\n
\n

在您的情况下word'EOF'(引用!),因此$package此处文档内部不会扩展。删除这些引号,您将获得所需的结果。

\n
cat > out.json <<EOF\n{\n    "apps": [\n    {\n        "cwd":"/usr/local/$package"\n    }\n}\nEOF\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n