bash中数组的动态变量名

Sam*_*Sam 2 arrays bash shell terminal command-line

我有一个名为“循环”的数组。

对于“循环”中的每个元素,我想创建一个数组,其名称包含当前元素的文本。

然后我想遍历每个新数组并打印每个数组中的每个元素。


这篇文章似乎对变量有一个很好的解决方案,但我不知道如何使它适用于数组。


我的脚本

#!/bin/bash
loop=(
first
second
third
)

for word in "${loop[@]}"    
do
        declare "${word}_holder=( hello world )"
        var="${word}_holder"
        echo "$var"
        for i in "${!var}[@]"
        do
                echo "$i"
        done
done
Run Code Online (Sandbox Code Playgroud)

电流输出

first_holder
( hello world )[@]
second_holder
( hello world )[@]
third_holder
( hello world )[@]
Run Code Online (Sandbox Code Playgroud)

期望输出

first_holder
hello
world
second_holder
hello
world
third_holder
hello
world
Run Code Online (Sandbox Code Playgroud)

kar*_*kfa 6

for word in "${loop[@]}"; 
do 
   name="${word}_holder";
   declare -a "$name"; 
   declare -n arr="$name";
   echo $name;
   arr=(hello world);
   arr_ref="$name[@]";
   for w in "${!arr_ref}";
   do 
      echo $w; 
   done; 
done;                             

first_holder                                                                                                                              
hello                                                                                                                                     
world                                                                                                                                     
second_holder                                                                                                                             
hello                                                                                                                                     
world                                                                                                                                     
third_holder                                                                                                                              
hello                                                                                                                                     
world     
Run Code Online (Sandbox Code Playgroud)

当然,如果您永远不打算引用动态生成的数组(first_holder 等),那么做这一切是没有意义的。


Jac*_*ack 5

它并不漂亮,但它是一个开始:

#!/bin/bash
loop=(
first
second
third
)

for word in "${loop[@]}"    
do
    var=${word}_holder
    eval "declare -a ${var}"
    eval "${var}=( Hello World )"
    eval 'nEntries=${#'${var}'[@]}'
    echo ${var}
    for (( ii=0; ii<$nEntries; ii++ )); do
       cmd='echo ${'${var}'['$ii']}'
       eval ${cmd}
    done
done
Run Code Online (Sandbox Code Playgroud)