如何在Freemarker模板中为Shell脚本使用不同插值语法
解决${}插值语法冲突的方案
方向1:转义bash脚本中的${},避免被原有插值系统处理
如果只是想保留bash原生的${}语法、不让原有插值工具替换,直接在${}前加转义符即可(具体转义符看原有插值系统的规则):
- 多数场景用反斜杠转义:
\${datetime},原有插值系统会忽略该语法,bash执行时会自动去掉反斜杠,识别为原生的${datetime} - 若使用envsubst这类工具,也可以指定仅替换特定变量,但灵活性不如转义直接
方向2:修改bash脚本的插值语法为{{}},让bash支持解析
如果一定要用{{}}作为bash的插值语法,可通过两种方式实现:
方法1:预处理脚本后执行
用sed把脚本中的{{xxx}}替换为${xxx},再交给bash执行:
# 预处理并执行目标脚本 sed 's/{{\([a-zA-Z0-9_]*\)}}/${\1}/g' your_script.sh | bash
脚本里直接写{{datetime}},预处理后会自动转为bash可识别的变量语法。
方法2:脚本内部定义替换函数
在bash脚本开头添加自定义函数,专门解析{{}}语法:
# 定义{{}}转${}的解析函数 parse_vars() { local content="$1" echo "$content" | sed 's/{{\([a-zA-Z0-9_]*\)}}/${\1}/g' } # 使用示例 datetime=$(date +%Y%m%d) # 先解析变量再执行命令 command_str=$(parse_vars "/home/../schipt.sh {{datetime}}") eval "$command_str"
方向3:配置原有插值系统,区分处理bash代码块
如果原有插值系统支持区域配置(比如模板引擎的标签规则),可以给bash代码块标记特殊区域:
- 让插值系统在bash块内使用{{}}语法替换变量,其他区域保留${...}
- 或者直接配置插值系统跳过bash代码块的${}解析,只处理非bash区域的变量
针对示例脚本的修改示例
转义方式
# sample script . . command: /home/../schipt.sh \${datetime}
{{}}预处理方式
# sample script . . command: /home/../schipt.sh {{datetime}}
执行前用上述sed命令预处理即可。
内容的提问来源于stack exchange,提问作者Epsi95
相关产品推荐
相关产品推荐

