Bash嵌套for循环迭代异常,无法对应IP与ID求助
问题:Bash脚本无法正确关联IP地址与对应ID
我用curl从应用获取JSON数据,示例响应如下:
{ "count": 2, "value": [ { "id": 344, "name": "ip-172-20-94-68", "status": "offline" }, { "id": 345, "name": "ip-172-20-95-119", "status": "offline" } ] }
我的Bash脚本如下:
ipAddresses=$(curl -s -X GET "$hostUrl" -u :"$EncodedPAT" | jq -r ".value[] | select(.status==\"offline\").name") ids=$(curl -s -X GET "$hostUrl" -u :"$EncodedPAT" | jq -r ".value[] | select(.status==\"offline\").id") for ipAddress in "${ipAddresses[@]}" do for id in "${ids[@]}" do echo "ipAddress: ${ipAddress} id: ${id}" done done
实际输出:
ipAddress: ip-172-20-94-68 ip-172-20-95-119 ip-172-20-95-113 ip-172-20-94-96 ip-172-20-94-86 id: 344 345 346 348 350
预期输出应为:
ipAddress: ip-172-20-94-68 id: 344 ipAddress: ip-172-20-95-119 id: 345 ipAddress: ip-172-20-95-113 id: 346 ipAddress: ip-172-20-94-96 id: 348 ipAddress: ip-172-20-94-86 id: 350
问题原因与解决方案
问题原因
- 变量不是数组:
ipAddresses和ids用$(...)赋值后是普通字符串,并非Bash数组。"${ipAddresses[@]}"会把整个字符串当成数组的单个元素,导致外层循环只执行一次,输出时字符串里的换行符直接被解析显示。 - 嵌套循环逻辑错误:就算把变量改成数组,嵌套循环也会生成每个IP与所有ID的笛卡尔积,根本无法实现IP和ID的一一对应。
正确解决方案
方案一:一次请求+jq联合输出(推荐)
只发送一次curl请求,用jq将每个离线节点的name和id用分隔符(比如逗号)拼接后输出,再通过read拆分对应字段:
curl -s -X GET "$hostUrl" -u :"$EncodedPAT" | jq -r '.value[] | select(.status=="offline") | "\(.name),\(.id)"' | while IFS=, read -r ipAddress id; do echo "ipAddress: $ipAddress id: $id" done
该方案更高效,还能避免两次请求之间数据更新导致IP与ID不匹配的问题。
方案二:数组按索引遍历
如果一定要用数组存储结果,可以用mapfile将数据存入数组,再按索引一一对应遍历:
# 将name和id分别存入数组 mapfile -t ipAddresses < <(curl -s -X GET "$hostUrl" -u :"$EncodedPAT" | jq -r '.value[] | select(.status=="offline").name') mapfile -t ids < <(curl -s -X GET "$hostUrl" -u :"$EncodedPAT" | jq -r '.value[] | select(.status=="offline").id') # 按数组索引遍历,确保IP和ID一一对应 for i in "${!ipAddresses[@]}"; do echo "ipAddress: ${ipAddresses[$i]} id: ${ids[$i]}" done
内容的提问来源于stack exchange,提问作者freshGrad
相关产品推荐
相关产品推荐

