shell 在数组和关联数组混合上迭代

aor9mmx1  于 2023-10-23  发布在  Shell
关注(0)|答案(2)|浏览(128)

我有以下脚本:

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
f4t66c6m

f4t66c6m1#

sup[arr]=$arrsup[arr]=$arr[0]是一样的。你只能得到数组的第一个元素。Bash的数据结构一般来说并不那么强大。数组只将整数Map到字符串,而关联数组只将字符串Map到字符串。你不能嵌套数据结构在对方没有诉诸黑客。
在这种情况下,您可以将数组的名称存储在sup中,并像在其他地方一样使用名称引用。

sup[arr]=arr
# iterating items instead of indices here, if you really
# need the indices then use the ${!sup[@]} logic as you have 
for el in "${sup[@]}" ; do
  declare -n items="$el"
  for item in "${items[@]}" ; do
    declare -n temp="$item"
    echo "${temp[file]}"
  done
done
093gszye

093gszye2#

我认为解决办法如下:

arr=siteFiles$j[@]
for index in "${!arr}"
do
   declare -n temp="$index"
   echo "${temp[path]}"
done

相关问题