Bash While循环脚本echo输出异常原因咨询
问题原因及解决办法
你的脚本输出不符合预期,核心原因是文本文件的行尾带了Windows风格的回车符(\r)。
具体原理:
- 你的文件大概率是在Windows环境创建/编辑的,行尾是
\r\n(CRLF),而Linux系统默认用\n(LF)作为换行符。 read -r line读取行时,只会自动剔除换行符\n,但会保留\r。所以第一行的line变量实际是goce\r。- 当执行
echo "File: ${line}"时,\r会让终端光标跳回行首,后续输出的:直接覆盖了开头的File,最终就显示成了goce:。
验证方式
用cat -v查看文件里的不可见字符:
cat -v /tmp/tmpGetFilefile-only
如果输出里第一行末尾有^M(这是\r的可视化标识),就坐实了这个问题。
解决办法
有三种常用方式:
- 直接转换文件格式(需要
dos2unix工具):
dos2unix /tmp/tmpGetFilefile-only
- 用
sed批量去掉行尾的\r:
sed -i 's/\r$//' /tmp/tmpGetFilefile-only
- 在脚本里处理变量,读取后剔除
\r:
#!/bin/bash while read -r line do line=${line%$'\r'} echo "File: ${line}" done < /tmp/tmpGetFilefile-only
内容的提问来源于stack exchange,提问作者goced
相关产品推荐
相关产品推荐

