Может вам вообще не нужно городить эти все циклы, а просто почитать справку по rsync и сделать все рсинком?
Он может и папки сравнить и скопировать и файл сгенерировать.
В вашем случае cat array | while запускает весь блок while в отдельном шелл процессе, и естественно результат в родительский процесс не вернется, умерев вместе с завершением цикла и дочерним процессом.
Делай так:
#!/bin/bash
i=1
while read str
do
array["$i"]="$str"
i=$(($i+1))
done <array.list
echo ${array[@]}