我正在尝试在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
中所读到的,行为应该是相反的。
答案 0 :(得分:7)
shell评估未引用的here文档,并在将其传递给命令(在您的情况下为sudo
)之前执行变量插值。因为IP
不是父shell中的已定义变量,所以它会扩展为空字符串。
使用引号,您可以防止父shell进行变量插值,因此sudo
运行的shell会查看并展开变量。