shell_62.shell脚本生成一个标准的 SQL INSERT 语句

无论是将文件读入脚本,还是将数据从脚本输出到文件,都会用到文件重定向,这是一种很

常见的操作。本节中的示例脚本两种功能皆有。它会读取 CSV 格式的数据文件,输出 SQL INSERT

语句,并将数据插入数据库。

shell 脚本使用命令行参数指定待读取的 CSV 文件。CSV 格式用于从电子表格中导出数据,

你可以把这些数据库数据放入电子表格,将电子表格保存为 CSV 格式,读取文件,然后创建

INSERT 语句将数据插入 MySQL 数据库。

实现这些操作的脚本如下:

复制代码
$cat test23 
#!/bin/bash 
# read file and create INSERT statements for MySQL 
outfile='members.sql' 
IFS=',' 
while read lname fname address city state zip 
do 
 cat >> $outfile << EOF 
 INSERT INTO members (lname,fname,address,city,state,zip) VALUES 
('$lname', '$fname', '$address', '$city', '$state', '$zip'); 
EOF 
done < ${1} 
$ 

这个脚本很简短。这要感谢文件重定向。脚本中出现了 3 处重定向操作。while 循环使用

read 语句(参见第 14 章)从数据文件中读取文本。注意在 done 语句中出现的重定向符号:

复制代码
done < ${1} 

当运行脚本 test23 时,$1 代表第一个命令行参数,指明了待读取数据的文件。read 语句使

用 IFS 字符解析读入的文本,这里将 IFS 指定为逗号。

脚本中另外两处重定向操作出现在同一条语句中:

复制代码
cat >> $outfile << EOF 

这条语句包含一个输出追加重定向(双大于号)和一个输入追加重定向(双小于号)。输出

重定向将 cat 命令的输出追加到由$outfile 变量指定的文件中。cat 命令的输入不再取自标准

输入,而是被重定向到脚本内部的数据。EOF 符号标记了文件中的数据起止:

复制代码
INSERT INTO members (lname,fname,address,city,state,zip) VALUES 
('$lname', '$fname', 
 '$address', '$city', '$state', '$zip'); 

上述文本生成了一个标准的 SQL INSERT 语句。注意,其中的数据由变量来替换,变量中

的内容则由 read 语句存入。

while 循环基本上一次读取一行数据,然后将这些值放入 INSERT 语句模板中,最后将结果

输出到文件中。

在这个例子中,使用以下脚本作为输入文件:

复制代码
$ cat members.csv 
Blum,Richard,123 Main St.,Chicago,IL,60601 
Blum,Barbara,123 Main St.,Chicago,IL,60601 
Bresnahan,Christine,456 Oak Ave.,Columbus,OH,43201 
Bresnahan,Timothy,456 Oak Ave.,Columbus,OH,43201 
$ 

运行脚本时,显示器上不会有任何输出:

复制代码
$ ./test23 members.csv 
$ 

但是在输出文件 members.sql 中,可以看到以下内容:

复制代码
$ cat members.sql 
INSERT INTO members (lname,fname,address,city,state,zip) VALUES ('Blum','Richard', '123 Main St.', 'Chicago', 'IL', '60601'); 
INSERT INTO members (lname,fname,address,city,state,zip) VALUES ('Blum','Barbara', '123 Main St.', 'Chicago', 'IL', '60601'); 
INSERT INTO members (lname,fname,address,city,state,zip) 
 VALUES ('Bresnahan','Christine', '456 Oak Ave.', 'Columbus', 'OH', '43201'); 
INSERT INTO members (lname,fname,address,city,state,zip) 
 VALUES ('Bresnahan','Timothy', '456 Oak Ave.', 'Columbus', 'OH', '43201'); 
$ 

结果和我们预想的一样。现在可以直接将 members.sql 文件导入 MySQL 数据表中了。

相关推荐
vfvfb6 分钟前
bat批量去掉本文件夹中的文件扩展名
服务器·windows·批处理·删除扩展名·bat技巧
jiunian_cn1 小时前
【Linux】centos软件安装
linux·运维·centos
藥瓿亭1 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
程序员JerrySUN1 小时前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构
孤寂大仙v1 小时前
【计算机网络】非阻塞IO——select实现多路转接
linux·计算机网络
2302_809798321 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣1 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
玩转4G物联网1 小时前
零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
服务器·网络·物联网·网络协议·tcp/ip·http·fs100p
派阿喵搞电子2 小时前
Ubuntu下有关UDP网络通信的指令
linux·服务器·网络
Evan_ZGYF丶2 小时前
【PCIe总线】 -- PCI、PCIe相关实现
linux·嵌入式·pcie·pci