如何在 bash 中创建动态数量且具有动态名称的数组?

问题描述 投票:0回答:1

我使用的是 bash 版本 5.1.16

我正在尝试编写一个 bash 脚本来创建动态数量的数组,每个数组都有一个动态名称,该名称将保存已声明数组中的一些元素部分。我正在尝试将单个数组拆分为多个数组,这些数组将保存相同数量的元素。

dec_array = (abc10 def2 ghi333 jkl mno51 pqr_6) # this array will always have some multiple of three elements but variable in the number of elements
num_elem=3
num_arr=0 # will eventually incr and loop once this works
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_n,例如,

dyn_array_0: abc10 def2 ghi333
dyn_array_1: jkl mno51 pqr_6

完成创建具有动态名称的动态数量的数组的正确语法是什么?

arrays bash
1个回答
0
投票

通过

bash 4.3+
,我们可以使用 nameref 动态创建变量(包括数组)。

有几种方法可以对此进行分割;对于这个答案,我只是要预先计算出新数组的数量,然后当我们遍历

dec_array[]
数组时,我们将填充新数组。

dec_array=(abc10 def2 ghi333 jkl mno51 pqr_6)

num_elements="${#dec_array[@]}"
elements_per_array=3
num_arrays="$(( num_elements / elements_per_array ))"

counter=0

for ((i=1; i<=num_arrays; i++))
do
    declare -n _arr="dyn_array_$i"                       # nameref
    _arr=()                                              # initialize the new array

    for ((j=1; j<=elements_per_array; j++))
    do
        (( counter > num_elements)) && break 2           # once we run out of elements we break out of both for loops
        _arr+=( "${dec_array[counter]}" )                # append current element to _arr[]

        (( counter++ ))
    done
done

结果:

$ typeset -p dyn_array_1 dyn_array_2
declare -a dyn_array_1=([0]="abc10" [1]="def2" [2]="ghi333")
declare -a dyn_array_2=([0]="jkl" [1]="mno51" [2]="pqr_6")

稍后在脚本中访问数组:

for ((i=1; i<=num_arrays; i++))
do
    declare -n _arr="dyn_array_$i"
    echo "############### ${!_arr}"

    for ((j=0; j<${#_arr[@]}; j++))
    do
         echo "dyn_array_$i[$j] = ${_arr[j]}"
    done
done

注意:第二个

echo
正在打印4个字符串:“dyn_array_$i[”+“$j”+“] =”+“${_arr[j]}”

这会生成:

############### dyn_array_1
dyn_array_1[0] = abc10
dyn_array_1[1] = def2
dyn_array_1[2] = ghi333
############### dyn_array_2
dyn_array_2[0] = jkl
dyn_array_2[1] = mno51
dyn_array_2[2] = pqr_6
© www.soinside.com 2019 - 2024. All rights reserved.