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

遍历JSON对象执行curl命令时的变量替换异常问题

问题排查:遍历JSON URI执行curl仅部分生效

需求与问题

需求:遍历给定JSON对象中children数组的uri字段,将每个uri(如/Image1提取为Image1)作为变量${i}传入curl命令:

curl -k -s --user user:password -X GET "https://artifactory.com/api/releases/baseimage/${i}"

执行的命令:

for i in $(curl -k -s --user user:password -X GET "https://artifactory.com/api/releases/baseimage/" | jq -r ".children[] |.uri"); do curl -k -s --user user:password -X GET "https://artifactory.com/api/releases/baseimage/${i}"; done

问题:仅Image3对应的变量替换生效,Image1和Image2未正常执行请求。

附原始JSON响应:

{
  "repo": "releases",
  "path": "/apps/releases",
  "created": "2021-04-01T10:12:23.496-01:00",
  "children": [
    {
      "uri": "/Image1",
      "folder": true,
      "created": "2022-08-09T17:12:22.987-04:00"
    },
    {
      "uri": "/Image2",
      "folder": true,
      "created": "2022-06-10T10:12:22.412-10:00"
    },
    {
      "uri": "/Image3",
      "folder": true,
      "created": "2022-10-10T07:03:14.742-01:00"
    },
    {
      "uri": "/Image4",
      "folder": true,
      "created": "2022-10-10T07:10:11.542-08:00"
    }
  ]
}

原因分析

  1. URL格式错误:当前jq输出的uri包含开头的斜杠(如/Image1),拼接后URL变为https://artifactory.com/api/releases/baseimage//Image1,部分Artifactory实例对连续斜杠的URL处理异常,导致请求失败;仅Image3可能因服务器特殊配置或缓存偶然生效。
  2. for循环分词风险:for i in $(...)会按空格、换行等分隔符分词,若JSON中uri包含特殊字符,可能导致变量提取异常。

解决方法

修正后的命令

curl -k -s --user user:password -X GET "https://artifactory.com/api/releases/baseimage/" | jq -r '.children[] |.uri | ltrimstr("/")' | while read -r i; do
  curl -k -s --user user:password -X GET "https://artifactory.com/api/releases/baseimage/${i}"
done

关键改进点

  • 移除uri开头的斜杠:使用jq的ltrimstr("/")过滤掉uri开头的斜杠,确保拼接后的URL格式为baseimage/Image1,符合Artifactory的API规范。
  • 改用while循环读取:while read -r i逐行处理jq的输出,避免for循环的分词问题,即使uri包含空格或特殊字符也能稳定处理。

调试版命令(可选)

若需要确认每个变量是否正确替换,可添加日志输出:

curl -k -s --user user:password -X GET "https://artifactory.com/api/releases/baseimage/" | jq -r '.children[] |.uri | ltrimstr("/")' | while read -r i; do
  echo "Processing image: ${i}"
  curl -k -s --user user:password -X GET "https://artifactory.com/api/releases/baseimage/${i}"
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:05:41