1. 前言

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

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

渲染脚本:

#!/bin/bashSRC_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.

shell模板变量替换相关推荐

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

    linux bash shell之变量替换::=句法.=句法.:-句法.-句法.=?句法.?句法.:+句法.+句法 变量替换和变量默认值设置是紧密相关的,至少从概念出发是如此. 参数扩张是将类似于变量 ...

  2. Java 模板变量替换——字符串替换器

    Java 模板变量替换--字符串替换器 说明 可选方法 org.apache.commons.text java.text.MessageFormat java.lang.String 说明 这里分享 ...

  3. Java 模板变量替换——字符串替换器{}、${}、${}map

    // 直接使用hutool工具类即可 // format("this is {} for {}", "a", "b") => this ...

  4. shell中的命令替换和变量替换

    一.命令替换 可以用'command', 也可以用$(command). 二者是有区别的,先看一下'command'(注意:这里不是引号,而反引号) 1. `command' 用来做命令替换 2. $ ...

  5. shell中变量的替换

    shell中变量的替换 Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换 条件放在{}中. 1.${value:-word} 当变量未定义或者值为空时,返回值为word ...

  6. linux读取环境变量替换,linux Shell脚本学习笔记二(变量和环境变量)

    2.变量和环境变量 使用env命令在终端中查看所有与此终端进程相关的环境变量.对于每个进程,在起运行时的环境变量可以使用下面的命令来查看: cat /proc/$PID/environ 其中,将PID ...

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

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

  8. shell脚本学习第四天——bash内部变量,变量主串,变量替换

    一.bash内部变量: 常见的内部命令:echo,eval,exec,export,readonly,read,shift ,wait,exit和点(.)也就是source命令. 命令 作用 echo ...

  9. 传智播客PHP笔记05-thinkphp框架-视图渲染、display,fetch,模板替换,模板变量的赋值与实现,系统变量,模板函数,模板运算符,foreach,if,比较标签,volist标签

    1.视图概述 将具体的视图模板进行输出显示,有两个方法 display:获取具体要输出的内容,然后直接输出 fetch:获取具体要输出的内容,但不会自动输出 2.display的使用(输出模板内容) ...

最新文章

  1. android meta data值获取的坑
  2. secureCRT 实现windows和linux文件互传
  3. word怎么设置图片编号(图片下标,图片标签,图片序号,图片注释,题注)(交叉引用)
  4. 18行代码解决:(C语言)L1-046 整除光棍 (20分)
  5. ctypes python_Python使用Ctypes与C/C++
  6. 英文操作系统(chcp:437)让Console输出UTF-8
  7. Android/Linux性能分析工具推荐
  8. tarjan算法 转载
  9. 计算机键盘英语,电脑键盘打字时中英文如何切换?
  10. 华为隐藏功能扩大内存代码大全_华为手机隐藏功能代码大 | 手游网游页游攻略大全...
  11. 用devc++表白_【重大表白墙】19级倪yl,风吹起如花般破碎的流年,而你的笑容摇晃摇晃,成为我命途中最美的点缀...
  12. python动态网页爬取——四六级成绩批量爬取
  13. html5 在线视频编辑器,一种基于html5的多轨道视频编辑的方法及系统与流程
  14. 给初学者推荐一个摆脱变量命名纠结的神器
  15. 沈春华教授加入浙江大学!
  16. 【书】测试架构师-必备的6个能力
  17. 网络环境切换,会导致虚拟机网络地址更换
  18. 29-高级路由:BGP清除
  19. 银行卡的卡号号段标识
  20. jQuery——遍历DOM元素的后代元素

热门文章

  1. 杭州某B2B软件公司面试题
  2. vue 签署文件两张图合并成一张图 h5页面转换成图片并长按保存在本地
  3. 【强化学习论文合集】二十二.2020国际机器学习大会论文(ICML2020)
  4. spring-boot-打版-破坏前端文件导致字体图标无法显示
  5. 什么是HOOKED上瘾模型?如何用其提升用户活跃和粘性?
  6. invalid index of a 0-dim tensor. Use `tensor.item()`
  7. 一天破万:二十一个微信公众号推广技巧(终结版)
  8. APP注册发送验证码
  9. 交易基础(二)K线分析
  10. windows截屏录屏 (D3d) 游戏黑屏 解决思路