shell模板变量替换

原文链接: https://cloud.tencent.com/developer/article/1368062

1. 前言

我们经常使用一些模板语言来处理一些变量替换。比如jsp,php,velocity,freemarker,thymeleaf等。那对于shell来说,应该怎样替换变量呢。有一种很简单的办法可以做到。

先来看一个应用场景。在datax是阿里开源的一个异构数据源同步框架,其配置文档是json的,我想要用shell去调用执行pg到pg的数据同步,需要根据我的配置生成对应的配置文件。这如果用java来做就是维护一个对象,设置value,最后json-encode就好了。要是使用shell,这样也可以做到:

渲染脚本:

#!/bin/bash

SRC_USER_NAME=etl
SRC_USER_PWD=etl
SRC_SQL="select * from tab"
SRC_HOST_IP="192.168.1.1"
SRC_HOST_PORT=3306
SRC_DB="abc_db"
TAR_USER_NAME="etl2"
TAR_USER_PWD="pass2"
fields_map="\"a\",\"b\",\"c\""
TAR_HOST_IP="aaaadfsdfdsfjsdjf"
TAR_HOST_PORT="5432"
TAR_DB="tar_db"
TAR_TABLENAME="tbname"
eval "cat < result.json

模板文档: pg2pg.datax.json

{
    "job": {
        "setting": {
            "speed": {
                "byte": 1048576
            },
            "errorLimit": {
                "record": 0,
                "percentage": 0.02
            }
        },
        "content": [
            {
                "reader": {
                    "name": "postgresqlreader",
                    "parameter": {
                        "username": "${SRC_USER_NAME}",
                        "password": "${SRC_USER_PWD}",
                        "where": "",
                        "connection": [
                            {
                                "querySql": [
                                    "${SRC_SQL}"
                                ],
                                "jdbcUrl": [
                                    "jdbc:postgresql://${SRC_HOST_IP}:${SRC_HOST_PORT}/${SRC_DB}"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                
                    "name": "postgresqlwriter",
                    "parameter": {
                        "username": "${TAR_USER_NAME}",
                        "password": "${TAR_USER_PWD}",
                        "column": [
                            ${fields_map}
                        ],
                        "preSql": [
                            ""
                        ],
                        "connection": [
                            {
                                "jdbcUrl":  "jdbc:postgresql://${TAR_HOST_IP}:${TAR_HOST_PORT}/${TAR_DB}",
                                "table": [
                                    "${TAR_TABLENAME}"
                                ]
                            }
                        ]
                    }
                }
            }
        ]
    }
}

输出结果:

{
    "job": {
        "setting": {
            "speed": {
                "byte": 1048576
            },
            "errorLimit": {
                "record": 0,
                "percentage": 0.02
            }
        },
        "content": [
            {
                "reader": {
                    "name": "postgresqlreader",
                    "parameter": {
                        "username": "etl",
                        "password": "etl",
                        "where": "",
                        "connection": [
                            {
                                "querySql": [
                                    "select * from tab"
                                ],
                                "jdbcUrl": [
                                    "jdbc:postgresql://192.168.1.1:3306/abc_db"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                
                    "name": "postgresqlwriter",
                    "parameter": {
                        "username": "etl2",
                        "password": "pass2",
                        "column": [
                            "a","b","c"
                        ],
                        "preSql": [
                            ""
                        ],
                        "connection": [
                            {
                                "jdbcUrl":  "jdbc:postgresql://aaaadfsdfdsfjsdjf:5432/tar_db",
                                "table": [
                                    "tbname"
                                ]
                            }
                        ]
                    }
                }
            }
        ]
    }
}

核心内容:

eval "cat < result.json

其中有几个语法需要学习下。

第一,shell中变量的定义,变量赋值时,等号(=)`两边必须没有空格。

第二,eval的用法。

语法:eval cmdLine

eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描替换变量,然后执行cmdLine.

你可能感兴趣的:(Linux)