linuxshell中的EOF
关键词:EOF
在平时的运维⼯作中,我们经常会碰到这样⼀个场景:
执⾏脚本的时候,需要往⼀个⽂件⾥⾃动输⼊N⾏内容。如果是少数的⼏⾏内容,还可以⽤echo追加⽅式,但如果是很多⾏,那么单纯⽤echo追加的⽅式就显得愚蠢之极了!
这个时候,就可以使⽤EOF结合cat命令进⾏⾏内容的追加了。
下⾯就对EOF的⽤法进⾏梳理:
【1】基本⽤法
EOF是END Of File的缩写,表⽰⾃定义终⽌符.既然⾃定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.
EOF⼀般会配合cat能够多⾏⽂本输出.
其⽤法如下:
<<EOF        //开始
....
EOF            //结束
还可以⾃定义,⽐如⾃定义:
<<BBB        //开始
....
BBB              //结束
通过cat配合重定向能够⽣成⽂件并追加操作,在它之前先熟悉⼏个特殊符号:
< :输⼊重定向
> :输出重定向
>> :输出重定向,进⾏追加,不会覆盖之前内容
<< :标准输⼊来⾃命令⾏的⼀对分隔号的中间内容.
先举⼀个简单的例⼦,例1:
# cat << EOF
在出现输⼊提⽰符">",输⼊以下内容:
> Hello
> EOF
输⼊结束后,在终端显⽰以下内容:
Hello
【2】思考
我们可以从cat命令的说明中知道,cat的操作对象是⽂件,但是例1中cat的操作对象不是⽂件,⽽是⽤户输⼊。
那么我们可以这样理解例1:先在⽂件file中输⼊“Hello”,再⽤cat file输出其中的内容。
也就是说我们可以⽤⼀个⽂件来替代"<< EOF EOF"。
反过来说,如果操作命令中的⽂件是输⼊对象,也可以⽤"<< EOF EOF"来替代的。
为了验证上⾯的思考,我们试验两个例⼦:
【2.1】磁盘分区使⽤ eof ⽅式输⼊参数
sfdisk -uM /dev/sda << EOF
,2048,b
,1024,83
,1024,83
EOF
根据之前的思考,将"<< EOF"和"EOF"之间的内容保存到⽂件part中,然后将脚本修改为:
sfdisk -uM /dev/sda < part
经测试,修改后的⽅式可以达到同样的分区结果。
【2.2】将⼀个⽂件的内容输出到另⼀个⽂件中
# cat fileA > fileB
按照之前的思考,将"<< EOF EOF"替代输⼊对象⽂件fileA:
# cat << EOF > fileB
经测试,命令执⾏后提⽰⽤户输⼊内容,输⼊结束后,⽤户的输⼊内容被保存到了fileB中。
综上所述,“<< EOF EOF”的作⽤是在命令执⾏过程中⽤户⾃定义输⼊,它类似于起到⼀个临时⽂件的作⽤,只是⽐使⽤⽂件更⽅便灵活。
【3】EOF的妙⽤实践
下⾯通过具体实例来感受下EOF⽤法的妙处:
【3.1】向⽂件test.sh⾥输⼊多⾏内容
[root@slave-server opt]# cat << EOF >test.sh
> 123123123
> 3452354345
> asdfasdfs
> EOF
[root@slave-server opt]# cat test.sh
123123123
3452354345
asdfasdfs
【3.2】追加多⾏内容
[root@slave-server opt]# cat << EOF >>test.sh
> 7777
> 8888
> EOF
[root@slave-server opt]# cat test.sh
123123123
3452354345
asdfasdfs
7777
8888
【3.3】覆盖
[root@slave-server opt]# cat << EOF >test.sh
> 55555
> EOF
[root@slave-server opt]# cat test.sh
55555
【3.4】⾃定义EOF,⽐如⾃定义为wang
[root@slave-server opt]# cat << wang >
> ggggggg
> 4444444
> 6666666
> wang
[root@slave-server opt]#
ggggggg
4444444
6666666
【3.5】可以编写脚本,向⼀个⽂件输⼊多⾏内容
[root@slave-server opt]# touch /usr/local/mysql/myf              //⽂件不提前创建也⾏,如果不存在,EOF命令中也会⾃动创建[root@slave-server opt]# vim test.sh
#!/bin/bash
cat > /usr/local/mysql/myf << EOF                                      //或者cat << EOF > /usr/local/mysql/myf
[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
basedir = /usr/local/mysql/
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
sync_binlog=1
log_bin = mysql-bin
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port = 3306
EOF
[root@slave-server opt]# sh test.sh//执⾏上⾯脚本
[root@slave-server opt]# cat /usr/local/mysql/myf    //检查脚本中的EOF是否写⼊成功[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
basedir = /usr/local/mysql/
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
sync_binlog=1
log_bin = mysql-bin
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port = 3306
---------------------------------------------------------------------------------
【3.6】⾃动新建分区并挂载的EOF脚本案例
[root@es-node1 ~]# cat auto_add_disk.sh
#!/bin/bash
fdisk /dev/sdb <<EOF
linux执行shell命令n
p
1
wq
EOF
/4 /dev/sdb1 &&  /bin/mkdir -p /data && /bin/mount /dev/sdb1 /data
echo'LABEL=data_disk /data ext4 defaults 0 2' >> /etc/fstab