shell模板变量替换
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模板变量替换相关推荐
- linux bash shell之变量替换::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法
linux bash shell之变量替换::=句法.=句法.:-句法.-句法.=?句法.?句法.:+句法.+句法 变量替换和变量默认值设置是紧密相关的,至少从概念出发是如此. 参数扩张是将类似于变量 ...
- Java 模板变量替换——字符串替换器
Java 模板变量替换--字符串替换器 说明 可选方法 org.apache.commons.text java.text.MessageFormat java.lang.String 说明 这里分享 ...
- Java 模板变量替换——字符串替换器{}、${}、${}map
// 直接使用hutool工具类即可 // format("this is {} for {}", "a", "b") => this ...
- shell中的命令替换和变量替换
一.命令替换 可以用'command', 也可以用$(command). 二者是有区别的,先看一下'command'(注意:这里不是引号,而反引号) 1. `command' 用来做命令替换 2. $ ...
- shell中变量的替换
shell中变量的替换 Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换 条件放在{}中. 1.${value:-word} 当变量未定义或者值为空时,返回值为word ...
- linux读取环境变量替换,linux Shell脚本学习笔记二(变量和环境变量)
2.变量和环境变量 使用env命令在终端中查看所有与此终端进程相关的环境变量.对于每个进程,在起运行时的环境变量可以使用下面的命令来查看: cat /proc/$PID/environ 其中,将PID ...
- Shell替换:Shell变量替换,命令替换,转义字符
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value ...
- shell脚本学习第四天——bash内部变量,变量主串,变量替换
一.bash内部变量: 常见的内部命令:echo,eval,exec,export,readonly,read,shift ,wait,exit和点(.)也就是source命令. 命令 作用 echo ...
- 传智播客PHP笔记05-thinkphp框架-视图渲染、display,fetch,模板替换,模板变量的赋值与实现,系统变量,模板函数,模板运算符,foreach,if,比较标签,volist标签
1.视图概述 将具体的视图模板进行输出显示,有两个方法 display:获取具体要输出的内容,然后直接输出 fetch:获取具体要输出的内容,但不会自动输出 2.display的使用(输出模板内容) ...
最新文章
- android meta data值获取的坑
- secureCRT 实现windows和linux文件互传
- word怎么设置图片编号(图片下标,图片标签,图片序号,图片注释,题注)(交叉引用)
- 18行代码解决:(C语言)L1-046 整除光棍 (20分)
- ctypes python_Python使用Ctypes与C/C++
- 英文操作系统(chcp:437)让Console输出UTF-8
- Android/Linux性能分析工具推荐
- tarjan算法 转载
- 计算机键盘英语,电脑键盘打字时中英文如何切换?
- 华为隐藏功能扩大内存代码大全_华为手机隐藏功能代码大 | 手游网游页游攻略大全...
- 用devc++表白_【重大表白墙】19级倪yl,风吹起如花般破碎的流年,而你的笑容摇晃摇晃,成为我命途中最美的点缀...
- python动态网页爬取——四六级成绩批量爬取
- html5 在线视频编辑器,一种基于html5的多轨道视频编辑的方法及系统与流程
- 给初学者推荐一个摆脱变量命名纠结的神器
- 沈春华教授加入浙江大学!
- 【书】测试架构师-必备的6个能力
- 网络环境切换,会导致虚拟机网络地址更换
- 29-高级路由:BGP清除
- 银行卡的卡号号段标识
- jQuery——遍历DOM元素的后代元素
热门文章
- 杭州某B2B软件公司面试题
- vue 签署文件两张图合并成一张图 h5页面转换成图片并长按保存在本地
- 【强化学习论文合集】二十二.2020国际机器学习大会论文(ICML2020)
- spring-boot-打版-破坏前端文件导致字体图标无法显示
- 什么是HOOKED上瘾模型?如何用其提升用户活跃和粘性?
- invalid index of a 0-dim tensor. Use `tensor.item()`
- 一天破万:二十一个微信公众号推广技巧(终结版)
- APP注册发送验证码
- 交易基础(二)K线分析
- windows截屏录屏 (D3d) 游戏黑屏 解决思路