Linux基础系列文章大纲
Shell系列文章大纲


Bash中Here Document的各种语法姿势

here document表示这里是一个文档,文档有起始和终止标记,起始和终止标记中间的内容,属于文档内容。

虽说here document作为文档可以当作一个文件名来看待,但因为它是以重定向的方式存在的,使得它有各种使用姿势。

将here document内容写进文件

1
2
3
4
5
6
7
8
9
10
cat >>a.log <<EOF
abc
def
EOF

# 或者
cat <<EOF>>a.log
abc
def
EOF

这就是here document作为一种重定向语法的好处,使用here document时,它的位置可以随意摆放,而不像使用文件名,位置固定死了。

将here document内容放进管道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 方案一
cat <<EOF | awk
abc
def
EOF

# 方案二
( cat | awk ) <<EOF
abc
def
EOF

# 方案三
{ cat | awk } <<EOF
abc
def
EOF

# 方案四
{
cat <<EOF
abc
def
EOF
} | awk

# 方案五
(
cat <<EOF
abc
def
EOF
) | awk

其实只要理解了here document是一种重定向,位置可随意,就很容易理解上面几种方案。

多个here document嵌套

在Perl和Ruby语言中,都支持多个Here Document嵌套的语法,有时候这非常方便。但是在bash中,也可以实现嵌套。

1
2
3
4
5
6
7
(cat ; echo '======='; cat <&3) <<EOF 3<<eof
abc
def
EOF
ghi
jkl
eof