You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:45:43