Jenkins Pipeline执行含变量的jq命令报“Bad Substitution”错误
问题解决:Jenkins Pipeline中jq命令的"Bad substitution"错误
错误原因分析
- 环境变量引用错误:在Jenkins的
sh块中,Pipeline的env.*变量会直接作为shell环境变量存在,不需要写env.前缀。你写的${env.AWS_ACCOUNT_NUMBER}会被bash当作无效的参数替换语法,触发"Bad substitution"。 - 引号嵌套混乱:原命令的引号转义方式导致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核心表达式,遇到需要插入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
相关产品推荐
相关产品推荐

