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

Jenkins Pipeline执行含变量的jq命令报“Bad Substitution”错误

问题解决:Jenkins Pipeline中jq命令的"Bad substitution"错误

错误原因分析

  1. 环境变量引用错误:在Jenkins的sh块中,Pipeline的env.*变量会直接作为shell环境变量存在,不需要写env.前缀。你写的${env.AWS_ACCOUNT_NUMBER}会被bash当作无效的参数替换语法,触发"Bad substitution"。
  2. 引号嵌套混乱:原命令的引号转义方式导致bash无法正确解析字符串结构,进一步加剧了语法错误。

修正后的Pipeline代码

stage('process json') {
    steps {
        dir('mydir') {
            sh '''
                NEW_REVISION=$(cat revision.txt)
                jq '.Resources[].TargetService.Properties.TaskDefinition = "'"arn:aws:ecs:us-east-1:$AWS_ACCOUNT_NUMBER:task-definition/$TASK_NAME:$NEW_REVISION"'"' 
            '''
        }
    }
}

关键修改点

  • 移除环境变量的env.前缀:将${env.AWS_ACCOUNT_NUMBER}改为$AWS_ACCOUNT_NUMBER,${env.TASK_NAME}改为$TASK_NAME,让bash能正确识别shell环境变量。
  • 简化引号嵌套:用'"和"'拼接jq的字符串常量与shell变量,这种方式更清晰,bash能正确解析:
    • 单引号包裹jq核心表达式,遇到需要插入shell变量的地方,先关闭单引号('),用双引号包裹变量部分("$变量"),再重新打开单引号(')。

后续优化建议(按你备注的计划)

等格式问题解决后,建议改用jq的--arg参数传递变量,避免引号嵌套问题,同时提升安全性:

stage('process json') {
    steps {
        dir('mydir') {
            sh '''
                NEW_REVISION=$(cat revision.txt)
                jq --arg account "$AWS_ACCOUNT_NUMBER" \
                   --arg task "$TASK_NAME" \
                   --arg rev "$NEW_REVISION" \
                   '.Resources[].TargetService.Properties.TaskDefinition = "arn:aws:ecs:us-east-1:$account:task-definition/$task:$rev"'
            '''
        }
    }
}

内容的提问来源于stack exchange,提问作者Mike D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:55:21