我有以下脚本:
declare -A as1
declare -A as2
declare -a arr=()
declare -A sup
as1[file]="file1"
as2[file]="file2"
echo "test: ${as1[file]} ${as2[file]}"
i=1
arr+=(as$i)
i=2
arr+=(as$i)
for index in "${arr[@]}";
do
declare -n temp="$index"
echo "${temp[file]}"
done
sup[arr]=$arr
echo "try to print:"
for el in "${!sup[@]}"
do
item=${sup[$el]}
for index in "${item[@]}";
do
declare -n temp="$index"
echo "${temp[file]}"
done
done
它基本上构建了一个数组的关联数组。在数组中有两个关联数组。我不知道它是否太复杂,但它应该工作。问题是输出如下:
test: file1 file2
file1
file2
try to print:
file1
其中最后一行“file2”缺失。我想在最后一个循环中有一个错误,但我不能抓住它。有什么需要帮忙的吗?
编辑1
以下脚本:
declare -A as1
declare -A as2
declare -a arr=()
declare -A sup
as1[file]="file1"
as2[file]="file2"
echo "test: ${as1[file]} ${as2[file]}"
i=1
arr+=(as$i)
i=2
arr+=(as$i)
echo "test1:"
for index in "${arr[@]}";
do
declare -n temp="$index"
echo "${temp[file]}"
done
sup[arr]=arr
echo "test2:"
for el in "${sup[@]}" ; do
declare -n items="$el"
for item in "${items[@]}" ; do
declare -n temp="$item"
echo "${temp[file]}"
done
done
生成以下输出:
test: file1 file2
test1:
file1
file2
test2:
file1
file2
file1
file2
它似乎循环了两次
编辑2
我仍然有问题,在适用于一个真实的案件。我创建了以下目录和文件:
for p in 1 2;
do
mkdir -p "/tmp/tt/tt${p}";
for t in 1 2;
do
touch "/tmp/tt/tt${p}/test${t}"
done
done
我使用以下脚本:
declare -A sourceDirTree
create_source_directory_tree()
{
root_dir=$1
j=1
while read dir;
do
declare -a siteFiles$j
dir=${dir##*/}
i=1
while read file;
do
declare -A arrVar$j$i
declare -A "arrVar$j$i[path]=$file"
declare -a "siteFiles$j+=(arrVar$j$i)"
((i++))
done <<< $(find ${root_dir}/${dir} -type f)
arr=siteFiles$j
for index in "${arr[@]}"
do
declare -n temp="$index"
echo "${temp[path]}"
done
sourceDirTree[$dir]="siteFiles$j"
((j++))
done <<< $(find ${root_dir} -type d -maxdepth 1 -mindepth 1 2> /dev/null)
}
create_source_directory_tree /tmp/tt
我得到的结果如下:
# ./test.sh
siteFiles1 arrVar11
siteFiles2 arrVar21
我不明白为什么你能帮帮我吗?
更详细地说,下面的例子是有效的:
declare -A sourceDirTree
create_source_directory_tree()
{
dir="/tmp/tt/tt1"
declare -a siteFiles
dir=${dir##*/}
i=1
while read file;
do
echo "Processing file $file"
declare -A as$i
declare -A "as$i[path]=$file"
declare -a "siteFiles+=(as$i)"
((i++))
done <<< $(find /tmp/tt/${dir} -type f)
for index in "${siteFiles[@]}"
do
declare -n temp="$index"
echo "${temp[path]}"
done
}
但以下方法不起作用:
declare -A sourceDirTree
create_source_directory_tree()
{
dir="/tmp/tt/tt1"
j=1
declare -a siteFiles$j
dir=${dir##*/}
i=1
while read file;
do
echo "Processing file $file"
declare -A as$i
declare -A "as$i[path]=$file"
declare -a "siteFiles$j+=(as$i)"
((i++))
done <<< $(find /tmp/tt/${dir} -type f)
arr=siteFiles$j
for index in "${arr[@]}"
do
declare -n temp="$index"
echo "${temp[path]}"
done
}
它给了我以下输出:
Processing file /tmp/tt/tt1/test1
Processing file /tmp/tt/tt1/test2
as1
2条答案
按热度按时间f4t66c6m1#
sup[arr]=$arr
和sup[arr]=$arr[0]
是一样的。你只能得到数组的第一个元素。Bash的数据结构一般来说并不那么强大。数组只将整数Map到字符串,而关联数组只将字符串Map到字符串。你不能嵌套数据结构在对方没有诉诸黑客。在这种情况下,您可以将数组的名称存储在
sup
中,并像在其他地方一样使用名称引用。093gszye2#
我认为解决办法如下: