Bash中存储find输出的数组结构错误,无法正常索引
Bash数组存储文件名的错误分析与解决
核心错误点
- readarray分隔符使用错误:
find命令默认每个文件名单独占一行输出,你指定-d ' '(空格作为分隔符)完全不符合find的输出格式。你看到的空格是echo $myarray自动将数组元素拼接成空格分隔字符串的结果,实际find输出里文件名是用换行分隔的,这导致readarray把所有内容当成单个元素存入myarray[0]。 - 变量引用未加双引号:
find ${file_dir} -name ${pattern}中的变量如果包含空格会触发意外拆分,正确做法是用双引号包裹变量:find "${file_dir}" -name "${pattern}"。 - 数组输出方式错误:
echo $myarray只会输出数组的第一个元素,查看完整数组需要用echo "${myarray[@]}";你拆分后用echo ${myarray2}也只显示第一个元素,同样要改用echo "${myarray2[@]}"。
正确实现代码
利用readarray默认按换行分割的特性,直接将每个文件名存入数组独立元素:
# 定义目标文件夹 file_dir=./my_files # 定义匹配模式 pattern="*zzz*" # 将find结果存入数组(去掉错误的-d ' ',变量加双引号,加-maxdepth 1限制只搜索当前文件夹) readarray -t myarray < <(find "${file_dir}" -maxdepth 1 -name "${pattern}") # 打印整个数组 echo "${myarray[@]}" # 测试索引访问 echo "第一个文件:${myarray[0]}" echo "第二个文件:${myarray[1]}"
注:添加-maxdepth 1是为了严格匹配你“单个文件夹”的需求,避免find递归搜索子目录。
关于read拆分的补充说明
你执行read -r -a myarray2 <<< "${myarray[0]}"时,"${myarray[0]}"是所有文件名用换行分隔的字符串,read默认会按空白符(空格、换行、制表符)分割内容,所以myarray2其实已经正确存储了所有文件名。只是你用echo ${myarray2}只会输出数组第一个元素,改用echo "${myarray2[@]}"就能看到完整数组。
内容的提问来源于stack exchange,提问作者Lyam
相关产品推荐
相关产品推荐

