Azure DevOps任务组中jq参数传递$`替代$()的问题解决
Azure DevOps任务组Bash脚本jq参数问题解决
问题描述
在Azure DevOps任务组的Bash脚本中执行以下命令时:
jq --argjson timestamp "$`date +%s`" '.common |= . + {"TimeValue": $timestamp }' ${service}/${env}.json > tmpfile && mv tmpfile ${service}/${env}.json
触发报错:
jq: invalid JSON text passed to --argjson
Use jq --help for help with command-line options,
手动将$date +%s``替换为$(date +%s)后脚本可正常运行,但在任务组中修改该内容时,$(date +%s)会被识别为新增参数,无法直接修改。
解决方案
方案1:提前将时间戳存入变量
先通过子命令获取时间戳并存入变量,再将变量传给jq,避免直接在jq命令行中使用子命令展开:
timestamp=$(date +%s) jq --argjson timestamp "$timestamp" '.common |= . + {"TimeValue": $timestamp }' ${service}/${env}.json > tmpfile && mv tmpfile ${service}/${env}.json
这种写法将变量赋值与jq命令分离,Azure DevOps任务组不会把变量识别为新增参数,同时保证了传递给--argjson的是有效的数字值。
方案2:使用jq内置的now函数(推荐)
jq本身提供了now函数,可直接生成Unix时间戳,无需调用外部date命令,从根源上规避子命令展开的问题:
jq '.common |= . + {"TimeValue": now }' ${service}/${env}.json > tmpfile && mv tmpfile ${service}/${env}.json
这种写法更简洁,且完全避免了Azure DevOps任务组对命令行子语法的特殊解析,执行更稳定。
问题根源
原命令中$date +%s``的写法存在语法问题,反引号嵌套在双引号中时,展开后的内容可能包含多余的格式字符,导致传递给--argjson的不是有效的JSON数字,触发jq的参数错误。而$(date +%s)是正确的子shell展开语法,但Azure DevOps任务组会将其识别为需要替换的参数变量,因此无法直接在任务组中修改使用。
内容的提问来源于stack exchange,提问作者JS noob
相关产品推荐
相关产品推荐

