这是我逐行读取文件的代码:
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
如您所见,第一个字符被引号代替。并且该行最后的引用没有出现。这里发生了什么?我看不出错误?有什么想法吗?
最佳答案
很可能您在输入文件的行尾之前有 \r
。
您可以使用以下方法进行测试:
cat -vte file
这将在文件末尾显示 ^M$
有 dos 回车 \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")
关于bash - 为什么在读取文件时变量被剪切?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22681664/