没有引号的Heredoc没有扩展参数

时间:2016-06-01 07:09:55

标签: bash shell

我正在尝试在heredoc中创建和使用这样的变量,

#!bin/bash
sudo su - postgres <<EOF
IP="XYZ"
echo "$IP"
EOF

这不能正常工作,我得到一个空行作为回声。 但是,如果我使用EOF这样的引号,

#!bin/bash
sudo su - postgres <<"EOF"
IP="XYZ"
echo "$IP"
EOF

有效。有人可以解释一下吗?根据我在man中所读到的,行为应该是相反的。

1 个答案:

答案 0 :(得分:7)

shell评估未引用的here文档,并在将其传递给命令(在您的情况下为sudo)之前执行变量插值。因为IP不是父shell中的已定义变量,所以它会扩展为空字符串。

使用引号,您可以防止父shell进行变量插值,因此sudo运行的shell会查看并展开变量。