Azure Pipeline运行时变量生成JSON Patch值为空的问题排查
解决Azure Pipeline中生成Ingress Patch JSON时变量为空的问题
问题根源
你当前脚本里的echo命令用单引号包裹了整个JSON字符串,在Bash环境中,单引号内的变量不会被Shell解析替换,所以$sanitized_namespace直接被当作纯字符串输出,导致生成的JSON里value字段为空。
修正后的脚本
下面是两种可行的修正方案,任选其一即可:
- script: | sanitized_namespace="$(echo "$(Build.SourceBranchName)" | sed -r 's/[^a-z0-9-]//g')" echo "##vso[task.setvariable variable=sanitized_namespace]$sanitized_namespace" # 方案1:双引号包裹整体,转义内部JSON双引号 echo "[{\"op\": \"replace\", \"path\": \"/spec/rules/0/host\", \"value\": \"$sanitized_namespace.somedomain.com\"}]" > host-patch.json # 方案2:单引号+变量拼接,确保变量在单引号外被解析 # echo '[{\"op\": \"replace\", \"path\": \"/spec/rules/0/host\", \"value\": "'"$sanitized_namespace.somedomain.com"'"}]' > host-patch.json cat ./host-patch.json name: namespace displayName: 'Remove invalid characters for test namespace'
方案说明
- 方案1:用双引号包裹整个JSON字符串,同时对JSON内部的双引号添加反斜杠
\转义。这种方式下Shell会解析双引号内的$sanitized_namespace变量,同时保证最终生成的JSON格式合法。 - 方案2:将字符串拆分为多段,用单引号包裹静态JSON内容,变量部分放在单引号外部,通过引号拼接实现变量替换。这种方式避免了大量转义,可读性更强。
预期输出
执行脚本后,host-patch.json会生成符合要求的内容:
[{"op": "replace", "path": "/spec/rules/0/host", "value": "your-sanitized-namespace.somedomain.com"}]
内容的提问来源于stack exchange,提问作者Trevor Automation
相关产品推荐
相关产品推荐

