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

wol*_*ang 2 bash shell

我试图在这样的heredoc内创建和使用变量,

#!bin/bash
sudo su - postgres <<EOF
IP="XYZ"
echo "$IP"
EOF
Run Code Online (Sandbox Code Playgroud)

这不正常,我得到一个空行作为回声.但如果我EOF像这样使用引号,

#!bin/bash
sudo su - postgres <<"EOF"
IP="XYZ"
echo "$IP"
EOF
Run Code Online (Sandbox Code Playgroud)

有用.有人可以解释一下吗?根据我所读到man的行为应该是相反的.

tri*_*eee 7

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

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