是否可以使用 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
请注意,这与此处文档内变量周围的引号无关。