遍历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" } ] }
原因分析
- URL格式错误:当前jq输出的
uri包含开头的斜杠(如/Image1),拼接后URL变为https://artifactory.com/api/releases/baseimage//Image1,部分Artifactory实例对连续斜杠的URL处理异常,导致请求失败;仅Image3可能因服务器特殊配置或缓存偶然生效。 - 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
相关产品推荐
相关产品推荐

