为何在Bash中对关联数组执行手动冒泡排序会出现异常输出?
你的Bash关联数组冒泡排序问题解析
你遇到的核心问题是把关联数组当成普通索引数组来处理了,这直接导致了逻辑混乱和奇怪输出。我来给你拆解清楚:
问题根源
Bash的关联数组和普通数组完全不一样:
- 普通数组的索引是连续的整数(0、1、2...),可以通过递增数字直接遍历;
- 但你定义的
arraySalary是关联数组,它的索引(键)是你自定义的1、8、2,根本不是连续的整数。你的代码里用currentIndex从0开始递增访问数组,而你的数组里根本没有0、3这些键,访问不存在的键会得到空值,这就导致比较逻辑完全出错,自然输出奇怪。
修正方案:基于键的冒泡排序
要对关联数组按值排序,我们需要先提取它的所有键,然后针对键对应的数值来做冒泡排序,最后按排序后的键顺序输出结果。这里给你写好修正后的代码:
#!/bin/bash # 定义原关联数组 declare -A arraySalary=( [1]=1000 [8]=3000 [2]=2000 ) # 第一步:提取关联数组的所有键,存到普通数组里 keys=("${!arraySalary[@]}") total_keys=${#keys[@]} sortedDesc=false while ! $sortedDesc; do sortedDesc=true for ((currentIndex=0; currentIndex < total_keys -1; currentIndex++)); do # 获取当前和下一个要比较的键 key1=${keys[$currentIndex]} key2=${keys[$currentIndex+1]} # 比较两个键对应的薪资值(降序逻辑:如果前一个值小于后一个,就交换键的位置) if [[ ${arraySalary[$key1]} -lt ${arraySalary[$key2]} ]]; then # 交换键在数组中的位置 temp=${keys[$currentIndex]} keys[$currentIndex]=${keys[$currentIndex+1]} keys[$currentIndex+1]=$temp sortedDesc=false fi done done # 输出排序后的结果 echo "降序排序后的薪资数据:" for key in "${keys[@]}"; do echo "员工ID: $key,薪资: ${arraySalary[$key]}" done
关键细节说明
${!arraySalary[@]}:这个语法会返回关联数组的所有键,我们把它存到普通数组keys里,这样就能用冒泡排序对键的顺序进行调整;- 冒泡排序的核心是交换键的位置,而不是直接修改关联数组的结构,这样就能保留原数组的键值对应关系;
- 如果需要升序排序,只需要把
-lt改成-gt即可。
内容的提问来源于stack exchange,提问作者FlashspeedIfe
相关产品推荐
相关产品推荐

