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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:40:15