这是我逐行读取文件的代码:
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字符被引号替换.并且最后一行的引用没有出现.这里发生了什么?我看不出错误?任何的想法?
很可能你\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)