Bash脚本读取含空格文件名到数组出错原因排查
Bash脚本处理带空格文件名的数组遍历问题
你的问题根源不在readarray,而是出在数组遍历的语法上:
readarray确实是按换行符分割输入的,它已经正确把dir -Q -1输出的每一行(每个带空格的文件名)作为数组的单个元素存入my_array了。但你在for循环里写的for elem in ${my_array[@]}没有给数组引用加双引号,Bash会对未加引号的数组展开结果执行分词操作——默认把空格、制表符、换行符都当成分隔符,于是每个带空格的数组元素被拆成了两个部分,才导致输出错乱。
修正方案1:给数组遍历加双引号
只需要修改循环行,给${my_array[@]}加上双引号,就能保证数组的每个元素被当作完整的单元处理:
#!/bin/bash cd "test" readarray -t my_array < <(dir -Q -1) # 关键:给数组引用添加双引号 for elem in "${my_array[@]}" do echo "$elem" echo "---" done cd ..
修正方案2:用Shell Glob直接生成数组(更推荐)
依赖外部命令dir其实没必要,Bash内置的Glob功能可以直接安全地获取所有文件名,自动处理空格、特殊字符等问题:
#!/bin/bash cd "test" # 用Glob获取当前目录所有文件,自动存入数组,每个文件名是完整元素 my_array=(*) for elem in "${my_array[@]}" do # 如果需要输出带引号的格式,手动添加引号 echo "\"$elem\"" echo "---" done cd ..
这种方式不需要额外处理引号,还能避免外部命令带来的潜在问题,是处理文件名数组的标准做法。
内容的提问来源于stack exchange,提问作者BullWebster
相关产品推荐
相关产品推荐

