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

时间:2018-12-31 12:05:14

标签: arrays bash

我在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_FilesTest2_Files。变量属于数组类型,因为我在声明中使用了-a

但是如何在这样的循环中将$Files[*]复制到"${TestName}_Files"

我尝试过:

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

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

1 个答案:

答案 0 :(得分:2)

您将要使用newarray=( "${oldarray[@]}" )保持数组元素完整。 ${oldarray[*]}将涉及单词拆分,至少会与包含空格的元素分开。

但是,明显的declare -a "$name"=("${oldarray[@]}")不起作用,无论是否加上括号。一种方法似乎是使用名称ref。这会将old的内容复制到new,其中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