Bash二维关联数组遍历问题求助:按指定元素遍历输出
在Bash中遍历二维关联数组(基于已知元素列表)
我明白你遇到的困扰了——Bash的关联数组并没有原生的二维数组遍历语法,你之前尝试的${!x_matrix[$e,@]}写法其实并不符合Bash的语法规则。咱们换个思路,通过筛选数组键的方式来实现你想要的输出效果。
可行实现方案
核心思路是:遍历已知的elements列表,对每个元素,筛选出关联数组中以该元素开头的键,再拆分出子键部分,最后按格式输出。
declare -A x_matrix x_matrix[ele1,sub1]="asdfadf" x_matrix[ele2,sub3]="blabla" x_matrix[ele1,sub2]="no matters" x_matrix[ele3,sub1]="opps" elements=(ele1 ele2 ele3) for e in "${elements[@]}"; do # 遍历关联数组的所有键,筛选出当前元素对应的键 for key in "${!x_matrix[@]}"; do # 判断键是否以"当前元素,"开头 if [[ $key == "$e,"* ]]; then # 拆分出子键:去掉键开头的"$e,"前缀 sub=${key#"$e,"} # 按要求格式输出 echo "($e,$sub)> ${x_matrix[$key]}" fi done done
优化:按子键顺序输出
如果希望同一个元素下的子键按字典序排列(比如ele1的sub1在sub2前面),可以先收集匹配的键并排序,再遍历输出:
declare -A x_matrix x_matrix[ele1,sub1]="asdfadf" x_matrix[ele2,sub3]="blabla" x_matrix[ele1,sub2]="no matters" x_matrix[ele3,sub1]="opps" elements=(ele1 ele2 ele3) for e in "${elements[@]}"; do # 收集当前元素对应的所有键 matching_keys=() for key in "${!x_matrix[@]}"; do if [[ $key == "$e,"* ]]; then matching_keys+=("$key") fi done # 对键进行排序(确保子键按顺序显示) IFS=$'\n' sorted_keys=($(sort <<<"${matching_keys[*]}")) unset IFS # 遍历排序后的键输出 for key in "${sorted_keys[@]}"; do sub=${key#"$e,"} echo "($e,$sub)> ${x_matrix[$key]}" done done
代码说明
${!x_matrix[@]}:获取关联数组的所有键列表[[ $key == "$e,"* ]]:Bash的模式匹配,判断键是否以$e,开头,以此筛选当前元素对应的条目${key#"$e,"}:参数扩展语法,去掉键字符串开头的$e,前缀,得到子键sub- 排序部分通过
sort命令实现,利用IFS=$'\n'确保排序时按整行处理键,避免空格干扰
内容的提问来源于stack exchange,提问作者gtunon
相关产品推荐
相关产品推荐

