如何在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
相关产品推荐
相关产品推荐

