如何用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
相关产品推荐
相关产品推荐

