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


    本文承接《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

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

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

    有的人说我这样改:

    1. id=0
    2. name="name0"
    3. description="desc0
    4. sed -i '/COMMIT;/i INSERT INTO test_table(id, name, des) VALUES('\''${id}'\'', '\''${name}'\'', '\''${description}'\'');' shiyan.sql

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

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

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

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

    1. id=0
    2. name="name0"
    3. description="desc0"
    4. sql_str="INSERT INTO test_table(id, name, des) VALUES(${id}, '${license}', '${name}');"
    5. #echo "sql_str is: ${sql_str}"
    6. sed -i '/COMMIT;/i ${sql_str}' ./shiyan.sql

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

    1. PRAGMA foreign_keys=OFF;
    2. BEGIN TRANSACTION;
    3. CREATE TABLE test_table(id integer primary key, name text, description text);
    4. ${sql_str}
    5. 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

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

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

    1. id=0
    2. name="name0"
    3. description="desc0"
    4. sql_str="INSERT INTO test_table(id, name, des) VALUES(${id}, '${license}', '${name}');"
    5. #echo "sql_str is: ${sql_str}"
    6. #sed -i '/COMMIT;/i ${sql_str}' ./shiyan.sql
    7. sed -i '/COMMIT;/i '"${sql_str}"'' ./shiyan.sql

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

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

  • 相关阅读:
    SpringBoot项目中只执行一次的任务写法
    GitHub 2.9K,Awesome GIS 地理空间相关资源集合!
    EEG-fNIRS跨模态迁移学习优化BCI系统分类精度
    【机器学习】网络爬虫实战详解
    面试系列Spring:循环依赖Spring是如何解决的
    C++笔记-八股
    HTML期末学生大作业 基于HTML+CSS+JavaScript通用的后台管理系统ui框架模板
    Android Jetpack解析之——LiveData
    《C++ Primer》第3章 字符串、向量和数组(三)
    Coreldraw2020最新64位电脑完整版本下载教程
  • 原文地址:https://blog.csdn.net/phmatthaus/article/details/127404327