使用printf与echo打印Bash数组结果不同的原因排查
问题原因及解决方法
核心原因
你的L0316_F.txt文件大概率是Windows换行格式(每行结尾是\r\n而非Unix系统的\n)。虽然mapfile -t会自动去掉换行符\n,但每行末尾的\r(回车符)会被保留在数组元素中。
当你用echo "${IDfemales[@]}"输出时,每个元素后的\r会让终端光标回到行首,后续元素会直接覆盖前面的内容,最终看起来只显示最后一个元素;而printf '%s\n' "${IDfemales[@]}"因为每次输出后强制换行,\r的覆盖效果被换行抵消,所以能正常显示所有元素。
解决步骤
验证文件格式
执行以下命令查看文件换行符:cat -A ../L0316_F.txt如果每行结尾显示
^M$(^M对应\r),说明是Windows格式。三种修复方式
方式一:转换文件为Unix格式
用dos2unix工具转换(多数Linux发行版自带):dos2unix ../L0316_F.txt之后重新用
mapfile读取数组即可。方式二:读取时过滤
\r
修改awk命令,在输出前去掉行尾的\r:mapfile -t IDfemales < <(awk '{sub(/\r$/,""); print $1}' ../L0316_F.txt)方式三:读取后清理数组元素
对已读取的数组批量去掉\r:IDfemales=("${IDfemales[@]//$'\r'/}")
验证修复效果
执行以下命令,若能正常输出所有元素在一行,说明修复成功:
echo "${IDfemales[@]}"
内容的提问来源于stack exchange,提问作者coyk
相关产品推荐
相关产品推荐

