Bash脚本变量拼接字符串时内容错位问题求助
问题根源:Windows换行符(CRLF)导致的光标回退
你的问题其实是文件里的换行符格式不对——playlist-info-test.txt是Windows格式的CRLF(回车+换行),而Bash在处理时会把行尾的\r(回车符)当成行内容的一部分。当你执行echo $input_file时,\r会让终端光标回到当前行的开头,后面的.mp3就会覆盖掉前面的字符串,所以才出现了.mp3list 1这种奇怪的输出。
验证问题
先确认文件里的换行符:
cat -A playlist-info-test.txt
如果输出里每行结尾是^M$(^M是\r的可视化表示),那就坐实了是Windows换行符的问题。
解决步骤
1. 转换文件为Unix格式
用dos2unix工具转换(如果没有的话,大多数Linux发行版可以通过包管理器安装):
dos2unix playlist-info-test.txt
如果没有dos2unix,也可以用sed手动移除行尾的\r:
sed -i 's/\r$//' playlist-info-test.txt
2. 优化你的遍历脚本
你原来用wc -l+sed遍历行的方式效率很低,还容易出错,推荐用更简洁可靠的while read循环,同时加上IFS=和-r参数来保留行内的空格、避免转义字符被解析:
INFO_FILE=playlist-info-test.txt while IFS= read -r current_line; do input_file="${current_line}.mp3" echo "$input_file" done < "$INFO_FILE"
这个写法不仅能适配正确格式的文件,还能完美处理带空格的行内容。
为什么你之前的while read没起作用?
你提到尝试过while read line但没改善,大概率是因为没先处理文件里的\r,或者没加IFS=和-r参数导致空格被截断,但核心问题还是文件的换行符格式。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

