如何在Bash/Shell脚本中将文本文件读入3D/4D数组并单独读取元素
在Bash中模拟多维数组读取文本文件并访问元素
Bash本身没有原生的多维数组,但可以通过关联数组或嵌套普通数组来模拟实现类似二维(或更高维)数组的功能,满足你按Arr(行,列)形式访问元素的需求。
你的代码问题分析
你当前的代码核心问题出在循环遍历的条件上:${#arr[@]}/2完全不符合实际元素数量逻辑——你的每行有4个元素,总元素数是行数×4,应该用记录行数的变量$c来控制循环范围,而不是除以2。
修正后的关联数组实现
下面是修正后的代码,使用关联数组模拟二维数组,完全满足你的元素访问需求:
declare -A arr declare -i c=0 # 读取文件内容到关联数组,键格式为"行号,列号" while read -r M1 M2 M3 M4; do arr["$c,0"]="$M1" arr["$c,1"]="$M2" arr["$c,2"]="$M3" arr["$c,3"]="$M4" ((c++)) done < ip1 # 测试指定元素访问 echo "Arr (0,0) = ${arr["0,0"]}" echo "Arr (0,3) = ${arr["0,3"]}" echo "Arr (2,2) = ${arr["2,2"]}" # 遍历所有行输出 echo -e "\n所有内容:" for ((i=0; i<c; i++)); do echo "${arr["$i,0"]} ${arr["$i,1"]} ${arr["$i,2"]} ${arr["$i,3"]}" done
另一种方案:嵌套普通数组(Bash 4.0+支持)
如果你的Bash版本在4.0及以上,可以用嵌套数组来更直观地实现二维数组:
declare -a arr=() declare -i c=0 while read -r -a row; do arr[$c]="${row[@]}" ((c++)) done < ip1 # 转换为嵌套数组(需要Bash 4+) for ((i=0; i<c; i++)); do read -r -a arr[$i] <<< "${arr[$i]}" done # 测试元素访问 echo "Arr (0,0) = ${arr[0][0]}" echo "Arr (0,3) = ${arr[0][3]}" echo "Arr (2,2) = ${arr[2][2]}" # 遍历输出 echo -e "\n所有内容:" for row in "${arr[@]}"; do echo "${row[*]}" done
说明
- 关联数组方案兼容性更好,几乎所有支持
declare -A的Bash版本都能用(Bash 4.0+); - 嵌套数组方案更接近传统多维数组的写法,但依赖Bash 4.0及以上版本;
- 两种方案都能实现你需要的
行号,列号形式的元素访问。
内容的提问来源于stack exchange,提问作者Majid Rismankar
相关产品推荐
相关产品推荐

