本文承接《shell动态生成.sql文件的方法》一文,该文链接为:https://blog.csdn.net/phmatthaus/article/details/127388057
先来回顾一下前一篇文章中完成的事情:
(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变量引用
############################################################################
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;