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

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

问题原因与解决方案

问题原因

  1. 变量不是数组:ipAddresses和ids用$(...)赋值后是普通字符串,并非Bash数组。"${ipAddresses[@]}"会把整个字符串当成数组的单个元素,导致外层循环只执行一次,输出时字符串里的换行符直接被解析显示。
  2. 嵌套循环逻辑错误:就算把变量改成数组,嵌套循环也会生成每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:10:33