这是我逐行读取文件的代码:
IFS=$'\n'
myfile="$1"
i=0
while read line; do
echo "Line # $i: '$line'"
let i++
done < "$myfile"
这是作为参数传递的文件
Hello
stack
overflow
friends
我这样执行:test.sh input.txt
我得到了这个结果:
'ine # 0: 'Hello
'ine # 1: 'stack
'ine # 2: 'overflow
'ine # 3: 'friends
如您所见,fisrt字符被引号替换。而且最后一行的引用没有出现。这里发生了什么?我看不出错误?有什么想法吗?
答案 0 :(得分:5)
很可能在输入文件的行尾之前有\r
。
您可以使用以下方法测试:
cat -vte file
这将显示文件末尾的^M$
有回车符\r
。
您可以使用此脚本正确读取文件:
i=1
while IFS=$'\r' read -r line; do
echo "Line # $i: '$line'"
let i++
done < "$myfile"
或者使用以下方法将文件转换为unix文件:
dos2unix file
或者如果您不希望实际保存从\r
剥离的文件,您还可以使用:
while read line; do
........# your code as-is
done < <( tr -d '\r' < "$myfile")