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

har*_*on4 3 bash file

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

IFS=$'\n'
myfile="$1"
i=0
while read line; do
    echo "Line # $i: '$line'"
    let i++
done < "$myfile"
Run Code Online (Sandbox Code Playgroud)

这是作为参数传递的文件

Hello
stack
overflow
friends
Run Code Online (Sandbox Code Playgroud)

我执行它是这样的:test.sh input.txt我得到这个结果:

'ine # 0: 'Hello
'ine # 1: 'stack
'ine # 2: 'overflow
'ine # 3: 'friends
Run Code Online (Sandbox Code Playgroud)

如您所见,fisrt字符被引号替换.并且最后一行的引用没有出现.这里发生了什么?我看不出错误?任何的想法?

anu*_*ava 5

很可能你\r在输入文件的行尾之前有.

您可以使用以下方法测试相同:

cat -vte file
Run Code Online (Sandbox Code Playgroud)

这将显示^M$在文件末尾有dos回车\r.

您可以使用此脚本正确读取文件:

i=1
while IFS=$'\r' read -r line; do
   echo "Line # $i: '$line'"
   let i++
done < "$myfile"
Run Code Online (Sandbox Code Playgroud)

或者使用以下方法将文件转换为unix文件:

dos2unix file
Run Code Online (Sandbox Code Playgroud)

或者如果您不希望实际保存剥离的文件\r,您还可以使用:

while read line; do
........# your code as-is
done < <( tr -d '\r' < "$myfile")
Run Code Online (Sandbox Code Playgroud)