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

Bash脚本问题:如何将关联数组索引提取到另一数组

Bash脚本提取关联数组索引到数组的解决方案

原脚本问题梳理

你当前的脚本存在几处错误,导致无法实现提取索引的需求:

  1. 循环条件i<=${#data[@]}错误,${#data[@]}是关联数组的元素数量(这里是4),循环会多执行一次,超出数组范围
  2. 数组赋值语法错误,赋值时变量名前不能加$,正确写法是dataindex[$i]=值
  3. ${!data}会一次性返回所有索引,无法逐个赋值到数组的对应位置
  4. dataindex定义为关联数组没必要,用普通索引数组存储顺序索引更合适

正确实现代码

#!/bin/bash

declare -A data
declare -a dataindex  # 改用普通索引数组

data[food0]='pasta'
data[food1]='orange'
data[drink0]='water'
data[drink1]='juice'

# 遍历关联数组的所有索引,逐个存入dataindex
i=0
for key in "${!data[@]}"; do
    dataindex[$i]="$key"
    ((i++))
done

# 输出目标结果
echo "${dataindex[@]}"

简化写法

可以不用手动维护索引i,直接用数组追加语法+=自动添加元素:

#!/bin/bash

declare -A data
declare -a dataindex

data[food0]='pasta'
data[food1]='orange'
data[drink0]='water'
data[drink1]='juice'

# 直接追加索引到数组末尾
for key in "${!data[@]}"; do
    dataindex+=("$key")
done

echo "${dataindex[@]}"

索引过滤的扩展实现

如果需要基于索引规则过滤(比如只保留以food开头的索引),可以在遍历中加入条件判断:

declare -a filtered_indexes
for key in "${!data[@]}"; do
    # 判断索引是否以food开头
    if [[ "$key" == food* ]]; then
        filtered_indexes+=("$key")
    fi
done

echo "${filtered_indexes[@]}"  # 输出:food0 food1

内容的提问来源于stack exchange,提问作者Yohrannes Santos Bigoli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:27:15