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

标签 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

如您所见,第一个字符被引号代替。并且该行最后的引用没有出现。这里发生了什么?我看不出错误?有什么想法吗?

最佳答案

很可能您在输入文件的行尾之前有 \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/

相关文章:

linux - 将命令的输出和执行时间保存在 bash 脚本中的不同变量中

javascript - 如何检测 js 文件在运行时是否被缩小 (Node.js)

java - 将文件内容写入jsp

android - 在 Android 中解压文件时手机挂起

c++ - 字符串到二进制文件

linux - 从 shell 脚本中确定 Firefox 是否已呈现页面

php - 在 csv 中查找字符串并添加到每一行

bash - 如何过滤 bash 数组

linux - Tar 递归与原始文件夹比较

c - 如何声明指向文件的动态指针数组