shell动态生成.sql文件的方法进阶

137 阅读2分钟

本文已参与 [新人创作礼] 活动,一起开启掘金创作之路。

本文承接《shell动态生成.sql文件的方法》一文,该文链接为:

juejin.cn/post/715641…

先来回顾一下前一篇文章中完成的事情:

(1)建立空的sqlite数据库;

(2)dump数据库,生成相应的.dump文件;

(3)shell下利用sed命令向.dump文件添加(插入)数据,最终完成全部信息的构建。

但是存在一个问题,使这个方法到目前为止并不实用。之前向dump文件插入数据的脚本(举例)为:

sed -i '/COMMIT;/iINSERT INTO "test_table" VALUES(0,'\''name0'\'','\''des0'\'');' shiyan.sql

不知大家能不能发现其中的不足?

没错,数据项中都是具体的数值。在做脚本或程序的时候一般都是使用变量来代替具体的数值,这样才能保证程序的通用性和可用性。那么应该怎样进行修改才能用变量代替具体的数值?

有的人说我这样改:

id=0
name="name0"
description="desc0

sed -i '/COMMIT;/i INSERT INTO test_table(id, name, des) VALUES('\''${id}'\'',  '\''${name}'\'', '\''${description}'\'');' shiyan.sql

按照这个方法,实际生成的shiyan.sql内容如下:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table(id integer primary key, name text, description text);
INSERT INTO test_table(id, name, des) VALUES('${id}', '${name}', '${description}');
COMMIT;

可以看到,是把变量本身当成字符串写入文件了。这个方法不可行。

那是否还有其它办法?将sql语句先单提出来用变量代替,再执行sed命令是否可行?试一下,脚本如下:

id=0
name="name0"
description="desc0"

sql_str="INSERT INTO test_table(id, name, des) VALUES(${id}, '${license}', '${name}');"
#echo "sql_str is: ${sql_str}"

sed -i '/COMMIT;/i ${sql_str}' ./shiyan.sql

按照这个方法,实际生成的shiyan.sql内容如下:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table(id integer primary key, name text, description text);
${sql_str}
COMMIT;

依然不行。那么应该怎么办?

此时网上的一篇文章给出了解决方法,链接如下:

sed引入变量的几种方法_Bibibabi_的博客-CSDN博客_linux sed变量引用

############################################################################

sed引入变量的几种方法

1. sed命令使用单引号的情况下,可以使用’"$var"'引用(单引号,然后双引号,变量):

sed -i '2s/node_base/'"$i"'/' /etc/libvirt/qemu/$i.xml

2. sed命令中使用双引号的情况下,直接shell command或者$(shell command)引用命令执行:

sed -i "2s/node_base/$i/"  /etc/libvirt/qemu/$i.xml

############################################################################

按照以上文章给出的解决问题的思路,修改之前的脚本。修改后的脚本如下:

id=0
name="name0"
description="desc0"

sql_str="INSERT INTO test_table(id, name, des) VALUES(${id}, '${license}', '${name}');"
#echo "sql_str is: ${sql_str}"

#sed -i '/COMMIT;/i ${sql_str}' ./shiyan.sql
sed -i '/COMMIT;/i '"${sql_str}"'' ./shiyan.sql

这次生成的sql文件内容正确了,如下所示:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table (id integer primary key, name text, description text);
INSERT INTO test_table(id, name, des) VALUES(0,'name0','des0');
COMMIT;