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

BASH中如何循环获取不同长度数组的大小与指定元素?

BASH动态获取不同长度数组的大小及元素的正确方法

Bash不支持直接在参数展开中拼接变量作为数组名,这是你遇到bad substitution错误的原因。下面提供两种可行的解决方法,适配不同场景:

方法一:使用nameref(推荐,Bash 4.3+)

nameref是Bash 4.3及以上版本提供的命名引用特性,可创建指向目标数组的引用,直接通过引用操作数组,安全且直观。

获取数组长度

for ((r=0; r<rows; r++)); do
    declare -n line="line$r"  # 创建指向line$r的命名引用
    cols=${#line[@]}          # 通过引用直接获取数组长度
    echo "line$r 的长度: $cols"
    unset -n line             # 可选:解除引用,避免后续变量冲突
done

获取指定位置的元素

如果已知最大列数,或需要遍历数组所有元素:

cols=4
for ((r=0; r<rows; r++)); do
    declare -n line="line$r"
    echo "处理 line$r:"
    # 方式1:遍历数组所有元素(自动适配数组实际长度)
    for val in "${line[@]}"; do
        echo "元素: $val"
    done
    # 方式2:按最大列数遍历,不存在的元素会返回空字符串
    for ((c=0; c<cols; c++)); do
        val=${line[$c]}
        echo "位置[$r,$c] 的元素: $val"
    done
    unset -n line
done

方法二:使用eval(兼容旧版Bash,需注意安全)

eval可执行拼接后的命令字符串,适合不支持nameref的旧版Bash,但如果数组名或内容来自不可信输入,存在代码注入风险,需谨慎使用。

获取数组长度

for ((r=0; r<rows; r++)); do
    line="line$r"
    eval "cols=\${#$line[@]}"  # 拼接命令并执行,获取数组长度
    echo "line$r 的长度: $cols"
done

获取指定位置的元素

cols=4
for ((r=0; r<rows; r++)); do
    line="line$r"
    echo "处理 line$r:"
    for ((c=0; c<cols; c++)); do
        eval "val=\${$line[$c]}"  # 拼接命令并执行,获取指定位置元素
        echo "位置[$r,$c] 的元素: $val"
    done
done

内容的提问来源于stack exchange,提问作者Valerio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:15:57