• 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;

  • 相关阅读:
    记录一次bug
    【OpenCV】Chapter9.边缘检测与图像分割
    2022 lineCTF WEB复现WriteUp
    recaf反编译 java jar包
    css 占位隐藏
    DreamTexture.js - 基于稳定扩散的3D模型自动纹理化开发包
    单元测试是什么?怎么写?主要测试什么?
    【Node.js】包与npm包
    [Linux打怪升级之路]-环境变量
    十二.镜头知识之镜头分辨率(解析力)
  • 原文地址:https://blog.csdn.net/phmatthaus/article/details/127404327