我们经常使用一些模板语言来处理一些变量替换。比如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 <<EOF
$(< pg2pg.datax.json)
EOF
" > 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 <<EOF
$(< pg2pg.datax.json)
EOF
" > result.json

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

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

第二, eval的用法。

语法:eval cmdLine

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

[etl@data-server001 test]$ set 11 22 33 44
[etl@data-server001 test]$ echo $4
44
[etl@data-server001 test]$ echo $#
4
[etl@data-server001 test]$ echo "\$$#"
$4
[etl@data-server001 test]$ eval echo "\$$#"
44

本组测试中,echo可以读取变量的第一层定义,所以$#代表参数个数4,$4代表第4个参数44。但我们想要直接取最后一个参数,需要使用变量的值作为变量的value。eval就会再次扫描一遍。

第三,cat <<EOF 这是一个多行输入的操作。

[etl@data-server001 test]$ cat <<EOF
> aaa
> bbb
> ccc
> EOF
aaa
bbb
ccc

EOF代表End Of File,这里表示输入结束标志,<<EOF表示定义结束符为EOF,接下来直到输入EOF时,命令结束。cat就会把内容输出。cat本来是输出文件内容的,这里把输入当做临时文件处理了。

第四, $(xxx) 表示执行命令,和两个反引号的效果相同,会执行里面的命令。所以< pg2pg.datax.json 才会读取文件内容。

最后输入EOF结束内容。需要注意EOF前后不要有空格,必须是回车,不然就不代表最后一个字符了。

为了更加容易理解,可以修改渲染脚本

content=$(cat pg2pg.datax.json)
eval "cat <<EOF
$content
EOF" > result.json
  1. eval替换$content的值

shell模板变量替换的更多相关文章

  1. 【Linux】linux bash shell之变量替换::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法

    linux bash shell之变量替换::=句法.=句法.:-句法.-句法.=?句法.?句法.:+句法.+句法   linux bash shell之变量替换::=句法.=句法.:-句法.-句法. ...

  2. shell之变量替换:临时替换

    ​${FILE:-word} 若变量为空,给变量FILE添加一个临时默认值word,FILE本身值并不变化eg: FILE1=${FILE:-word} 若FILE为空,则赋予FILE1值word $ ...

  3. shell中的条件判断、参数以及变量替换

    文章转自: http://www.cnblogs.com/maxupeng/archive/2011/07/02/2096551.html 一.test命令 test命令是shell内部命令,它计算作 ...

  4. 【Shell脚本学习9】Shell替换:Shell变量替换,命令替换,转义字符

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value ...

  5. Shell变量替换,命令替换,转义字符

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value ...

  6. Shell命令替换与变量替换

    命令替换 命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出.命令替换的语法: `command` 注意是反引号,不是单引号,这个键位于 Esc 键下方.下面的例子中,将命令执 ...

  7. Shell替换:Shell变量替换,命令替换,转义字符

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: 复制纯文本复制 #!/bin/bash a=10 echo -e &quo ...

  8. 《TP5.0学习笔记---模板变量输出、替换和赋值篇》

    原文地址:http://blog.csdn.net/self_realian/article/details/75214922 模板变量输出.替换和赋值 我们看一下文件编译的结果,我们知道我们现在写的 ...

  9. shell编程系列1--shell脚本中的变量替换

    shell编程系列1--shell脚本中的变量替换 变量替换总结: .${变量#匹配规则} # 从头开始匹配,最短删除 .${变量##匹配规则} # 从头开始匹配,最长删除(贪婪模式) .${变量%匹 ...

随机推荐

  1. 使用Java类库POI生成简易的Excel报表

    使用Java类库POI生成简易的Excel报表 1.需求 1.数据库生成报表需要转义其中字段的信息.比如 1,有效 2.无效等 2.日期格式的自数据需要转义其格式. 3.标题的格式和数据的格式需要分别 ...

  2. linux上apache并发数与服务器内存关系计算!

    Linunx(本次为ubuntu) apache! 连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU.内存.带宽等都有关系. 查看当前的连接数可以用: ps aux | g ...

  3. HDU1536 S-Nim(sg函数变换规则)

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  4. FakeImageExploiter v1.3

    FakeImageExploiter v1.3 - backdoor images.jpg[.ps1] CodeName: Metamorphosis Version release: v1.3 (S ...

  5. javax.inject包

    javax.inject包 java提出的依赖注入标准,有别于以下传统的对象获取方式 构造方法 工厂模式 服务器定位模式(e.g. JNDI) 开发过程中是会有很多层层依赖的对象的,例如,Stopwa ...

  6. #12【BZOJ3003】LED BFS+状压DP

    题解: 看到区间修改先想一下差分 这题用差分是为了分析问题 现在的问题就变成了 原序列全为0,要使得特定的k个点变为1,每个操作改变x,y+1 然后我们会发现 对于二元组a,b我们要修改它,实际上是在 ...

  7. 计蒜客 无脑博士的试管们 【dfs】

    题目链接:https://nanti.jisuanke.com/t/31 题目大意: 无脑博士有三个容量分别是A,B,C 升的试管,A,B,C 分别是三个从 1 到20 的整数,最初,A 和 B 试管 ...

  8. Linux学习之文件特殊权限详解(SetUID、SetGID、Sticky BIT)(十一)

    Linux学习之文件特殊权限详解(SetUID.SetGID.Sticky BIT) 目录 SetUID SetGID Sticky BIT SetUID SetUID简介 只有可以执行的二进制程序和 ...

  9. P1939【模板】矩阵加速(数列)

    P1939[模板]矩阵加速(数列)难受就难受在a[i-3],这样的话让k=3就好了. #include<iostream> #include<cstdio> #include& ...

  10. asp.net获取浏览器端操作系统名称

    /// <summary>/// 获取浏览器端操作系统名称/// </summary>/// <returns></returns>public sta ...