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

如何在Bash 5.1.16中创建动态数量的动态名称数组?

Bash动态命名数组拆分解决方案

问题描述

使用Bash 5.1.16版本,需编写脚本将元素总数为3的倍数的数组拆分为多个元素数量相等的动态命名数组。尝试的脚本及执行报错如下:

尝试的脚本

dec_array = (abc10 def2 ghi333 jkl mno51 pqr_6) # 数组元素总数始终是3的倍数,但元素数量可变
num_elem=3
num_arr=0 # 后续会递增,先确保当前逻辑可行
for ((i=0; i < ${#dec_array[@]}; i+=num_elem)); do
    part=( "${dec_array[@]:i:num_elem}" )
    echo "Elements in first example: ${part[*]}"
    dyn_array_${num_arr}=( "${dec_array[@]:i:num_elem}" )
    echo "Elements in second example: $dyn_array_${num_arr}[*]}"
done

执行报错

Elements in first example: abc10 def2 ghi333
Elements in first example: jkl mno51 pqr_6

syntax error near unexpected token `"${dec_array[@]:i:num_elem}"'
`    dyn_array_${num_arr}=( "${dec_array[@]:i:num_elem}" )'

期望效果

将dec_array拆分为dyn_array_0、dyn_array_1等数组,示例如下:

dyn_array_0: abc10 def2 ghi333
dyn_array_1: jkl mno51 pqr_6

正确实现脚本

Bash不支持直接通过拼接变量名的方式定义数组,需借助declare命令实现动态命名数组的创建,同时修正原脚本中的语法错误。正确脚本如下:

#!/bin/bash
dec_array=(abc10 def2 ghi333 jkl mno51 pqr_6)
num_elem=3
num_arr=0

for ((i=0; i < ${#dec_array[@]}; i+=num_elem)); do
    # 使用declare创建动态命名索引数组
    declare -a "dyn_array_${num_arr}=(${dec_array[@]:i:num_elem})"
    # 输出验证动态数组内容
    echo -n "dyn_array_${num_arr}: "
    eval 'echo "${dyn_array_'${num_arr}'[*]}"'
    num_arr=$((num_arr + 1))
done

关键修正点

  • 数组赋值时等号两侧不能有空格:原脚本dec_array = (...)是语法错误,需改为dec_array=(...)。
  • 动态数组创建依赖declare命令:通过declare -a声明索引数组,同时拼接动态变量名完成数组定义。
  • 动态数组内容引用需用eval:直接拼接变量名无法正确解析数组结构,eval可以帮助解析动态生成的数组引用命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:22:29