here-doc 里的变量什么时候展开
写配置文件模板时常用 here-doc,变量展不展开全看开头那个引号:
cat <<EOF
host=$HOST
EOF
EOF 不加引号,$HOST 会展开;写成 <<'EOF' 则原样输出 $HOST。要防止命令替换($(...)、反引号)同样靠引号。
几个容易踩的点:
- 需要缩进又不想让空格进文件,用
<<-EOF,但它只去掉 tab,不去空格。 sudo下的 here-doc,变量在重定向时就已经被你当前 shell 展开了,不是你想要的用户环境。- 用
set -u时,未定义变量会让整个脚本退出,模板里的${VAR:-default}要注意。
写完 bash -n 检查一下,或者先输出到 stdout 看一眼再重定向。