Shell-shell中的 Here Document 语法
在 Shell(如 Bash)脚本中,<<-EOT .... EOT
是一种 Here Document(这里是文档)的语法形式,常用于多行字符串输入。
一、基本概念
Here Document 语法:
1 |
|
Shell 会把 <<标记
到 标记
之间的内容当作标准输入传给前面的命令。
二、<<-EOT
的含义
1. <<-EOT
是 Here Document 的一种变体:
<<
:表示开始一个 Here Document。-
:可选符号,表示在分界符前允许使用 Tab 缩进(仅 Tab,空格不行),以便代码更美观。EOT
:是结束标记(End Of Text),你可以换成别的名字,比如EOF
、END
、MYTEXT
等等。约定俗成常用EOF
或EOT
。
三、示例说明
示例 1:基本用法
1 |
|
输出:
1 |
|
示例 2:带缩进的 Here Document(使用 -
)
1 |
|
这个写法是合法的,因为 EOT
前用了 Tab 缩进。输出为:
1 |
|
⚠️ 注意:如果
EOT
前面用的是空格而不是 Tab,则会报错:warning: here-document at line ... delimited by end-of-file (wanted ‘EOT’)
。
四、应用场景
传递多行文本给命令(如
cat
,mysql
,psql
,ssh
等):1
2
3
4
5mysql -u root -p <<EOF
CREATE DATABASE test;
USE test;
CREATE TABLE users (id INT, name VARCHAR(50));
EOF赋值多行字符串给变量
1
2
3
4
5
6message=$(cat <<'EOF'
Hello,
This is a multi-line string.
EOF
)
echo "$message"保留变量替换或执行命令
1
2
3
4
5name="Alice"
cat <<EOF
Hello $name
Today is $(date)
EOF禁止变量替换(使用单引号包裹标记)
1
2
3
4cat <<'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