天天看點

一文掌握EOF在Shell腳本中的妙用

前言:

 EOF是End Of File的縮寫,表示自定義終止符。既然自定義,那麼EOF就不是固定的,可以随意設定别名,意思是把内容當作标準輸入傳給程式,Linux中按Ctrl-d就代表EOF。

 在Shell中我們通常将EOF與 << 結合使用,表示後續的輸入作為子指令或子Shell的輸入,直到遇到EOF為止,再傳回到主調Shell。回顧一下< <的用法,當shell看到< <的時候,它就會知道下一個詞是一個分界符。在該分界符以後的内容都被當作輸入,直到shell又看到該分界符(位于單獨的一行)。這個分界符可以是你所定義的任何字元串。

用法:

<<EOF        //開始
....
EOF          //結束
           

複制

也可以自定義,如:

<<FFF        //開始
....
FFF         //結束
           

複制

注意:

 第一個EOF必須以重定向字元<<開始,第二個EOF必須頂格寫,否則會報錯。

EOF配合cat能夠進行多行文本輸出。

通過cat配合重定向能夠生成檔案并追加操作,在它之前先回顧幾個特殊符号:

<   :輸入重定向
>   :輸出重定向
>>  :輸出重定向,進行追加,不會覆寫之前内容
<<  :标準輸入來自指令行的一對分隔号的中間内容
           

複制

例:

[root@localhost ~]# cat <<EOF   //運作後會出現輸入提示符">"
> Hello
> wolrd
> EOF
輸入結束後,在終端顯示以下内容:
Hello
wolrd
           

複制

1.向檔案file1.txt中輸入内容

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

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

複制

追加内容至file1.txt中

[root@localhost ~]# cat >>file1.txt <<EOF
> 111
> 222
> 333
> EOF

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

複制

覆寫file1.txt

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

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

複制

2.自定義EOF

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

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

複制

3.編寫一個腳本,生成mysql配置檔案

[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資料庫建表、指派并查詢

[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
           

複制

-運作腳本檢視執行結果

[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
           

複制

-在資料庫中檢視新增的資料:

[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   |
+------+------+---------+           

複制