Plainnotes

here-doc 里的变量什么时候展开

2025-05-07 · 2 分钟工具

写配置文件模板时常用 here-doc,变量展不展开全看开头那个引号:

cat <<EOF
host=$HOST
EOF

EOF 不加引号,$HOST 会展开;写成 <<'EOF' 则原样输出 $HOST。要防止命令替换($(...)、反引号)同样靠引号。

几个容易踩的点:

  • 需要缩进又不想让空格进文件,用 <<-EOF,但它只去掉 tab,不去空格。
  • sudo 下的 here-doc,变量在重定向时就已经被你当前 shell 展开了,不是你想要的用户环境。
  • 用 set -u 时,未定义变量会让整个脚本退出,模板里的 ${VAR:-default} 要注意。

写完 bash -n 检查一下,或者先输出到 stdout 看一眼再重定向。