EOF在Shell脚本中的应用

前言:

EOFEnd Of File的缩写,表示自定义终止符。既然自定义,那么EOF就不是固定的,可以随意设置别名,意思是把内容当作标准输入传给程序,Linux中按Ctrl-d就代表EOF

Shell中我们通常将EOF<< 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。回顾一下<<的用法,当Shell看到<<的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到Shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。

用法:

1
2
3
<<EOF        //开始
....
EOF //结束

也可以自定义,如:

1
2
3
<<FFF        //开始
....
FFF //结束

注意:

第一个EOF必须以重定向字符<<开始,第二个EOF必须顶格写,否则会报错。如果将开始处的<<切换为<<-, 则结束分界符EOF前有制表符或者空格,则EOF此时仍然被当做结束分界符,此时EOF不必顶格写。

EOF配合cat能够进行多行文本输出。

通过cat配合重定向能够生成文件并追加操作,在它之前先回顾几个特殊符号:

1
2
3
4
<   :输入重定向
> :输出重定向
>> :输出重定向,进行追加,不会覆盖之前内容
<< :标准输入来自命令行的一对分隔号的中间内容

例:

1
2
3
4
5
6
7
[root@localhost ~]# cat <<EOF   //运行后会出现输入提示符">"
> Hello
> wolrd
> EOF
输入结束后,在终端显示以下内容:
Hello
wolrd

1. 向文件file1.txt中输入内容

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# cat >file1.txt <<EOF
> aaa
> bbb
> ccc
> EOF

[root@localhost ~]# cat file1.txt
aaa
bbb
ccc

追加内容至file1.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# cat >>file1.txt <<EOF
> 111
> 222
> 333
> EOF

[root@localhost ~]# cat file1.txt
aaa
bbb
ccc
111
222
333

覆盖file1.txt

1
2
3
4
5
6
[root@localhost ~]# cat >file1.txt <<EOF
> Hello wolrd
> EOF

[root@localhost ~]# cat file1.txt
Hello wolrd

2. 自定义EOF

1
2
3
4
5
6
7
8
[root@localhost ~]# cat >file1.txt <<FFF
> test
> hello
> FFF

[root@localhost ~]# cat file1.txt
test
hello

3. 编写一个脚本,生成mysql配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@localhost ~]# vim /root/test.sh
#!/bin/bash
cat >/root/EOF/my.cnf <<EOF
[client]
port=3306
socket=/usr/local/mysql/var/mysql.sock
basedir=/usr/local/msyql/
datadir=/data/mysql/data
pid-file=/data/mysql/data/mysql.pid
user=mysql
server-id=1
log_bin=mysql-bin
EOF

[root@localhost ~]# cat /root/EOF/my.cnf //查看生成的mysql配置文件
[client]
port=3306
socket=/usr/local/mysql/var/mysql.sock
basedir=/usr/local/msyql/
datadir=/data/mysql/data
pid-file=/data/mysql/data/mysql.pid
user=mysql
server-id=1
log_bin=mysql-bin

4. 编写脚本向mysql数据库建表、赋值并查询

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# vim eof.sh
#!/bin/bash
mysql -uroot -p123456 <<EOF
use test;
create table data(name varchar(15),age int,address varchar(25));
desc test.data;
insert into data values("tom",23,"china");
select * from data;
exit
EOF

4.1 运行脚本查看执行结果

1
2
3
4
5
6
7
8
9
[root@localhost ~]# bash eof.sh    //运行脚本,查看数据库中信息
mysql: [Warning] Using a password on the command line interface can be insecure.
Field Type Null Key Default Extra
name varchar(15) YES NULL
age int(11) YES NULL
address varchar(25) YES NULL

name age address
tom 23 china

4.2 在数据库中查看新增的数据:

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
34
35
36
[root@localhost ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+

mysql> use test;

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| data |
+----------------+

mysql> desc test.data;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(15) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| address | varchar(25) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+

mysql> select * from data;
+------+------+---------+
| name | age | address |
+------+------+---------+
| tom | 23 | china |
+------+------+---------+

5. EOF中的变量处理

在使用cat EOF中出现$变量通常会直接被执行,显示执行的结果。若想保持$变量不变需要使用 \ 符进行注释 . 当存在$变量过多,或存在赋值命令的时候可直接在EOF上加上双引号就行。

EOF处理变量
1
2
3
4
5
6
7
8
9
10
11
cat << "EOF" > ~/.gitconfig
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme
EOF