Bash脚本问题:如何将关联数组索引提取到另一数组
Bash脚本提取关联数组索引到数组的解决方案
原脚本问题梳理
你当前的脚本存在几处错误,导致无法实现提取索引的需求:
- 循环条件
i<=${#data[@]}错误,${#data[@]}是关联数组的元素数量(这里是4),循环会多执行一次,超出数组范围 - 数组赋值语法错误,赋值时变量名前不能加
$,正确写法是dataindex[$i]=值 ${!data}会一次性返回所有索引,无法逐个赋值到数组的对应位置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
相关产品推荐
相关产品推荐

