Shell-shell中的 Here Document 语法

在 Shell(如 Bash)脚本中,<<-EOT .... EOT 是一种 Here Document(这里是文档)的语法形式,常用于多行字符串输入。


一、基本概念

Here Document 语法:

1
2
3
4
<<标记
任意内容
...
标记

Shell 会把 <<标记标记 之间的内容当作标准输入传给前面的命令。


二、<<-EOT 的含义

1. <<-EOT 是 Here Document 的一种变体:

  • <<:表示开始一个 Here Document。
  • -:可选符号,表示在分界符前允许使用 Tab 缩进(仅 Tab,空格不行),以便代码更美观。
  • EOT:是结束标记(End Of Text),你可以换成别的名字,比如 EOFENDMYTEXT 等等。约定俗成常用 EOFEOT

三、示例说明

示例 1:基本用法

1
2
3
4
cat <<EOF
Hello, world!
This is a test.
EOF

输出:

1
2
Hello, world!
This is a test.

示例 2:带缩进的 Here Document(使用 -

1
2
3
4
cat <<-EOT
Line 1
Line 2
EOT

这个写法是合法的,因为 EOT 前用了 Tab 缩进。输出为:

1
2
Line 1
Line 2

⚠️ 注意:如果 EOT 前面用的是空格而不是 Tab,则会报错:warning: here-document at line ... delimited by end-of-file (wanted ‘EOT’)


四、应用场景

  1. 传递多行文本给命令(如 cat, mysql, psql, ssh 等):

    1
    2
    3
    4
    5
    mysql -u root -p <<EOF
    CREATE DATABASE test;
    USE test;
    CREATE TABLE users (id INT, name VARCHAR(50));
    EOF
  2. 赋值多行字符串给变量

    1
    2
    3
    4
    5
    6
    message=$(cat <<'EOF'
    Hello,
    This is a multi-line string.
    EOF
    )
    echo "$message"
  3. 保留变量替换或执行命令

    1
    2
    3
    4
    5
    name="Alice"
    cat <<EOF
    Hello $name
    Today is $(date)
    EOF
  4. 禁止变量替换(使用单引号包裹标记)

    1
    2
    3
    4
    cat <<'EOF'
    Hello $name
    Today is $(date)
    EOF

    输出时不会展开 $name$(date)


五、总结

语法 含义
<<EOT 标准 Here Document,内容中可以包含变量替换
<<'EOT' 禁止变量替换(保留原样)
<<"EOT" 支持变量替换(默认行为)
<<-EOT 允许结束标记前有 Tab 缩进
<<- 'EOT' 允许缩进 + 禁止变量替换

Shell-shell中的 Here Document 语法
https://dnacore.github.io/post/75d153ce-8611-470f-b7ce-851292a250e2.html
作者
DNACore
发布于
2025年5月27日
更新于
2025年5月27日
许可协议