在Bash中使用嵌套循环填充数组

时间:2014-03-07 19:40:20

标签: arrays bash nested-loops

我很好奇以下为什么:

array1=(file1 file2 file3)
array2=()
for i in ${array1[@]}
do
    find . -name $i -type f -print0 2>/dev/null | \
        while read -d '' -r file
        do
            array2+=( $file )
        done
done

无法填充array2,假设文件名file1,file2和file3存在于启动搜索的父目录的子目录中的文件系统中。如果有人能指出我在这里错误的地方,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

试试这个:

array1=(file1 file2 file3)
array2=()
for i in "${array1[@]}"
do
        while read -d '' -r file
        do
            array2+=( "$file" )
        done < <(find . -name "$i" -type f -print0)
done

由于您使用了管道,因此在子shell结束时会创建子shell并且您的array2值会丢失。

答案 1 :(得分:1)

如果您使用bash 4,则可以避免使用find

shopt -s globstar
array1=(file1 file2 file3)
array2=()
for i in "${array1[@]}"
do
    for f in **/"$i"; do
        [[ -f "$f" ]] && array2+=( "$f" )
    done
done