Heredoc:传递带有变量和多个“$”字符的字符串

Heredoc: Passing a string with a variable and multiple "$" characters

我想在包含变量和多个“$”字符的 heredoc 中传递一个字符串。 没有 heredoc 的命令是:

FOO='BAR'
echo ${FOO}: '$NOT_A_VARIABLE'

FOO 变量被正确替换,'$NOT_A_VARIABLE' 字符串避免替换,因为它是单引号。命令 returns 符合预期:

BAR: $NOT_A_VARIABLE

现在如果我在 heredoc 中做同样的事情:

sh << EOF
   echo ${FOO}: '$NOT_A_VARIABLE'
EOF

输出不是我想要的:

BAR:

似乎 '$NOT_A_VARIABLE' 被替换了,即使它被单引号括起来。

我知道这可以通过用反斜杠转义 $ 来避免:$ 但是这个解决方案很烦人,因为可能有多个 $ 字符随机分布在字符串中.

我想知道是否可以巧妙地使用引号 (single/double) 或其他可能解决此问题的解决方案。

您此处文档的内容被视为双引号字符串,就好像您已经编写了

echo "$FOO: '$NOT_A_VARIABLE'" | sh

如果你想抑制所有参数扩展在here文档中,你可以引用分隔符:

sh << 'EOF'
    echo ${FOO}: '$NOT_A_VARIABLE'
EOF

哪个会过去

echo ${FOO}: '$NOT_A_VARIABLE'

作为 sh.

的输入

如果您只想抑制 特定的 扩展,请像在双引号字符串中一样转义 $

# echo "$FOO: $NOT_A_VARIABLE" | sh
sh << EOF
   echo ${FOO}: $NOT_A_VARIABLE
EOF