heredoc基本写法:用

heredoc 基本写法:用
Linux shell 脚本里写多行文本,heredoc 是最干净的方案,不用反复拼接 \n 或调多行 echo。关键就两点:起始用 ,结尾独占一行写完全相同的 <code>标记名。
常见错误是结尾标记前后有空格、tab 或其他字符——哪怕一个空格,shell 就不认,会一直等你输下去,直到超时或手动 Ctrl+D。
- 标记名可以是任意字母数字组合(推荐全大写,比如
EOF),但不能含空格或特殊符号 - 如果标记名不加引号,变量和命令会被展开;加单引号(
)则原样输出,不解析任何东西 - 结尾标记必须顶格写,前面不能有任何空白字符
cat <h3>避免变量意外展开:单引号包裹结束标记最保险</h3><p>脚本里写配置文件模板、SQL 片段或 YAML 内容时,常需要保留 <code>$</code>、<code>`</code> 这类字符原样输出。不加引号的 <code> 会把所有变量和命令替换掉,导致生成内容错乱。</code></p><p>比如写一段 Nginx 配置,里面带 <code>$host</code> 或 <code>$1</code>,不加引号就直接被 shell 当成变量去求值,结果变成空或报错。</p>
- 用
(单引号包住标记名)可彻底禁用展开,所有内容按字面量处理 - 若只需局部禁用,也可混用:先用未加引号的 heredoc,再在需要的地方转义,比如
\$HOME - 注意:单引号只影响结束标记本身,heredoc 内容里的单引号不受影响
cat <h3>嵌入命令或条件逻辑:heredoc 里也能执行 shell 语句</h3><p>heredoc 不只是“贴文本”,只要不加引号,里面的命令替换(<code>$(...)</code>)、算术扩展(<code>$((...))</code>)、甚至简单的 <code>if</code> 判断都能运行——前提是这些结构出现在未加引号的 heredoc 中。</p><p>典型场景是生成带动态值的部署脚本、临时配置或测试数据。但要注意:命令执行发生在 heredoc 解析阶段,不是写入后才运行。</p>
- 所有
$(...)在重定向前就执行完毕,结果直接写入目标(如文件或管道) - 不能在 heredoc 里写交互式命令(如
read),因为输入流已被重定向 - 如果要拼接多段逻辑,建议把复杂判断提到 heredoc 外,用变量承接后再插入,更易读也更可控
LOG_DIR="/var/log/myapp" cat /tmp/deploy.sh #!/bin/bash echo "Deploying to $(hostname)" mkdir -p $LOG_DIR echo "Log dir: $LOG_DIR" EOF
重定向到文件 vs 管道:权限、覆盖与追加要分清
heredoc 本身不决定写入行为,真正控制落盘的是它前面的重定向操作符。写错一个符号,可能覆盖重要文件,也可能静默失败。
最常见问题是用 > 覆盖了不该动的文件,或者忘了加 sudo 导致写入失败却没报错(尤其往 /etc/ 下写时)。
-
cat file.txt:覆盖写入,文件不存在会新建,存在则清空重写 -
cat > file.txt:追加写入,适合日志或配置拼接 sudo tee file.txt :绕过 shell 重定向权限限制,适合写系统级配置- 用
tee时别漏掉-a参数,否则仍是覆盖
heredoc 的本质是提供一块“输入流”,怎么用它,取决于你把它连给谁——cat、sudo tee、mysql 还是自定义程序,行为完全不同。










