Please enable Javascript to view the contents

Bash语法-自定义终止符EOF

 ·  ☕ 3 分钟

重要

1.简介

EOF是(END Of File)的缩写,表示自定义终止符。既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d 就代表EOF。

EOF一般会配合cat能够多行文本输出。

2. 用法说明

其用法如下:

1
2
3
<<EOF        #开始
....         #输入内容
EOF          #结束

还可以自定义,比如自定义:

1
2
3
4
5
#开始
<<ABC        
....
## 结束
ABC

通过cat配合重定向能够生成文件并追加操作,在它之前先熟悉几个特殊符号
<: 输入重定向
>: 输出重定向
>>: 输出重定向,进行追加,不会覆盖之前内容
<<: 标准输入来自命令行的一对分隔号的中间内容

1
2
3
cat <<EOF
hello
EOF

输出为:

1
hello

cat的操作对象是文件,而在上面例子中cat的操作对象是用户输入;用户输入是文件描述符0对应的特殊文件。标准输入0中保存了“Hello”,再用cat命令输出其中的内容。
<<EOF EOF的作用就是在执行命令过程中用户自定义输入,类似于一个临时文件。

再结合重定向>,可以将<<EOF EOF的内容写入到文件中。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
## 1. 创建1.txt文件,文件中有字段`abc`
echo "abc" > 1.txt

## 2. 向文件1.txt输入覆盖内容(也可以:cat > 1.txt <<EOF)
cat <<EOF > 1.txt 
11
aa
bb
lol
EOF

## "<< EOF EOF" 的作用是在命令执行过程中用户自定义输入,它类似于起到一个临时文件的作用,只是比使用文件更方便灵活。

3. cat <<EOFcat <<-EOF 的区别

两个都是获取stdin,并在EOF处结束stdin,输出stdout。

使用cat <<EOF时,输入完成后,需要在一个新的一行输入EOF结束stdin的输入。EOF必须顶行写,前面不能用制表符或者空格。
使用cat <<-EOF时,分界符(EOF)所在行的开头部分的制表符(Tab)都将被去除。这可以解决由于脚本中的自然缩进产生的制表符。

对应两种正确示例写法如下:

  1. cat <<EOF,EOF顶行写
1
2
3
4
5
6
7
8
## 最后的EOF不能包含制表符和空格,否则无法识别为结束分界符,无法表示stdin的结束。
#!/bin/bash

cat <<EOF

你好,EOF
EOF
  1. cat <<-EOF,EOF前可加空格
1
2
3
4
5
6
7
8
#!/bin/bash

## 虽然最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束。
cat <<-EOF

你好,EOF
      EOF

如果使用cat <<EOF,但结束分界符EOF前面有制表符或者空格,无法将EOF识别为结束分界符,只会继续被当做stdin来输入。所以会报如下报错

1
2.sh: line 5: warning: here-document at line 1 delimited by end-of-file (wanted `EOF')

脚本内容如下:

1
2
3
4
5
#!/bin/bash

cat <<EOF
你好,EOF  EOF

how-can-i-write-a-heredoc-to-a-file-in-bash-script
Here Documents

分享

Hex
作者
Hex
CloudNative Developer

目录