我在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
。
但是如何在这样的循环中将$Files[*]
复制到"${TestName}_Files"
?
我尝试过:
declare -a "${TestName}_Files"=${Files[*]}
但是它给出了一个错误,即=file01.txt
不是有效的标识符。
答案 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