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

如何用Bash从curl命令输出构建二维数组?

我来帮你解决这个Bash二维数组的问题~根据你描述的curl输出格式(一行里连续的姓名、电话成对出现,空格分隔),可以按以下步骤实现:

方法一:先拆分所有元素再分组(适合单行输出)

如果你的curl输出是一行内包含所有姓名和电话(像示例里那样),可以先把输出拆成一维数组,再两两分组存入模拟的二维数组:

#!/bin/bash

# 替换成你的目标URL
target_url="https://example.com/your-endpoint"

# 1. 获取curl输出并拆分为一维数组(自动按空格分割)
if ! read -ra all_elements < <(curl -s "$target_url"); then
    echo "❌ 调用curl获取数据失败,请检查URL或网络连接" >&2
    exit 1
fi

# 2. 初始化存储联系人的数组(模拟二维数组,每个元素是"姓名 电话")
declare -a contacts

# 3. 遍历一维数组,每两个元素作为一组存入
for ((i=0; i<${#all_elements[@]}; i+=2)); do
    name="${all_elements[$i]}"
    phone="${all_elements[$i+1]}"
    # 处理元素个数为奇数的情况(避免最后一组只有姓名)
    if [[ -n $phone ]]; then
        contacts+=("$name $phone")
    fi
done

# 4. 测试输出二维数组内容
echo "✅ 成功读取到${#contacts[@]}个联系人:"
for idx in "${!contacts[@]}"; do
    read -r contact_name contact_phone <<< "${contacts[$idx]}"
    echo "第$((idx+1))个:姓名=$contact_name,电话=$contact_phone"
done

方法二:如果curl输出是每行一个姓名+电话

如果你的curl输出实际是每行包含一组姓名和电话(比如换行分隔),可以直接用while循环成对读取:

#!/bin/bash

target_url="https://example.com/your-endpoint"

declare -a contacts

# 用进程替换避免子shell变量丢失问题
while read -r name phone; do
    if [[ -n $name && -n $phone ]]; then
        contacts+=("$name $phone")
    fi
done < <(curl -s "$target_url")

# 输出测试
for contact in "${contacts[@]}"; do
    read -r c_name c_phone <<< "$contact"
    echo "姓名: $c_name,电话: $c_phone"
done

补充说明

  • 如果你的Bash版本是4.3及以上,也可以使用真正的二维数组(数组的数组),比如:
    declare -A contacts  # 或者用索引式的二维数组
    index=0
    for ((i=0; i<${#all_elements[@]}; i+=2)); do
        contacts[$index,0]="${all_elements[$i]}"
        contacts[$index,1]="${all_elements[$i+1]}"
        ((index++))
    done
    # 访问方式:${contacts[0,0]} 是第一个姓名,${contacts[0,1]}是第一个电话
    
  • 加上curl -s是为了静默输出,避免进度条或错误信息干扰数据读取;
  • 代码里加入了错误检查,确保curl调用失败时能给出提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:27:27