代码之家  ›  专栏  ›  技术社区  ›  Paebbels

如何将数组复制到具有动态名称的新数组?

  •  0
  • Paebbels  · 技术社区  · 7 年前

    我在bash中有一个复杂的数据结构,如下所示:

    Test1_Name="test 1"
    Test1_Files=(
      file01.txt
      file02.txt
    )
    Test2_Name="test 2"
    Test2_Files=(
      file11.txt
      file12.txt
    )
    TestNames="Test1 Test2"
    

    在我改进的脚本中,我想从磁盘读取文件。每个测试都位于一个目录中。

    所以我有一个bash片段读取目录和所有文件名。结果出现在数组中: $Files[*] .

    如何将该数组复制到带有测试名称前缀的数组。让我们假设 $TestName 保留测试的名称。

    我知道如何创建动态命名数组:

    for $Name in $TestNames; do
      declare -a "${TestName}_Files"
    done
    

    将创建例如 Test1_Files Test2_Files . 变量是数组类型,因为我使用 -a 在声明中。

    但是我怎样才能复制呢 $文件[*] "${TestName}_Files" 在这样的循环中?

    我试过这个:

    declare -a "${TestName}_Files"=${Files[*]}
    

    但它给出了一个错误 =file01.txt 不是有效的标识符。

    1 回复  |  直到 7 年前
        1
  •  2
  •   ilkkachu CesarB    7 年前

    你会想用的 newarray=( "${oldarray[@]}" ) 保持数组元素的完整性。 ${oldarray[*]} 将涉及分词,这将打破至少与包含空格的元素。

    然而,显而易见的是 declare -a "$name"=("${oldarray[@]}") 不起作用,括号是否被引用。一种方法似乎是使用一个名称引用。这将复制 old new ,其中的名称 新的 可动态给出:

    #!/bin/bash
    old=("abc" "white space")
    name=new
    
    declare -a "$name"        # declare the new array, make 'ref' point to it
    declare -n ref="$name"    
    
    ref=( "${old[@]}" )       # copy
    
    #unset -n ref             # unset the nameref, if required
    declare -p "$name"        # verify results