5.2.6 Here文档与Here字符串

Here文档与Here字符串#

Here文档(Here Document)用于在脚本中嵌入多行文本并作为标准输入传递给命令;Here字符串(Here String)用于将单行字符串作为标准输入,适合简短输入。常用于生成配置、批量输入、模拟交互式命令。

文章图片

1)Here文档基本用法与命令解释
- command <<EOF:把 EOF 到 EOF 之间的多行内容作为 stdin 传给 command。
- 分隔符必须独占一行、前后无空格。

# 将多行内容送给 cat,输出到终端
cat <<EOF
line1
line2
EOF

2)变量/命令替换控制与示例
- 默认会进行变量展开与命令替换。
- 禁止展开使用 <<'EOF'<<\EOF

#!/usr/bin/env bash
name="ops"

# 允许展开
cat <<EOF
user: $name
date: $(date +%F)
EOF

# 禁止展开(原样输出)
cat <<'EOF'
user: $name
date: $(date +%F)
EOF

3)缩进与格式控制
- <<-EOF 会忽略行首的 Tab(非空格),便于脚本缩进。

cat <<-EOF
    indented line (tab)
EOF

4)生成配置文件的完整示例(含路径、预期效果)

#!/usr/bin/env bash
set -e

conf="/tmp/app.conf"

cat <<EOF > "$conf"
port=8080
log=/var/log/app.log
mode=prod
EOF

echo "生成配置文件:$conf"
cat "$conf"

预期输出

生成配置文件:/tmp/app.conf
port=8080
log=/var/log/app.log
mode=prod

5)为交互式命令提供输入(mysql 示例)

#!/usr/bin/env bash
# 说明:-uroot -p 会提示输入密码,若使用 -p'密码' 可避免交互
mysql -uroot -p <<EOF
CREATE DATABASE IF NOT EXISTS demo;
SHOW DATABASES;
EOF

6)Here字符串用法与命令解释
- command <<< "string":把字符串作为 stdin 传给 command。

# 统计单词数量
wc -w <<< "linux ops automation"
# 预期输出:3

7)排错与注意事项
- 分隔符不匹配:会导致 Here 文档持续读取直到 EOF,脚本“卡住”。
- 行尾空格:EOF(带空格)与 EOF 不匹配。
- 变量未定义:在 set -u 下会报错,建议先定义或用 ${var:-default}

#!/usr/bin/env bash
set -u
# 使用默认值避免未定义报错
cat <<EOF
user: ${name:-unknown}
EOF

8)练习
1. 编写脚本生成 /tmp/nginx.conf,包含 worker_processeserror_log 两行,使用 Here 文档。
2. 用 Here 字符串模拟 grep error 的输入,并输出匹配行。
3. 使用 <<'EOF' 生成包含 $HOME 字样的文件,确保不被展开。