为什么在读取文件时剪切变量?

时间:2014-03-27 08:12:54

标签: bash file

这是我逐行读取文件的代码:

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字符被引号替换。而且最后一行的引用没有出现。这里发生了什么?我看不出错误?有什么想法吗?

1 个答案:

答案 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")