关于bash文件读取EOL EOF的意外行为

时间:2014-04-02 11:57:11

标签: bash file-io

我在使用bash脚本读取文件时遇到了一些麻烦。

这是我想要阅读的文件:

--------------- (not in the file)
123.234 231.423
1223.23 132.134

--------------- (not in the file)

在此文件中,4个数字位于两条不同的行上,并且文件末尾有一行留空。每行末尾没有“空格”字符。

当我尝试使用此脚本读取此文件时:

for val in $(cat $myFile)
do
   echo "$val ";
done

我确实有以下结果:

123.234 
231.423 

1223.23 
 32.134

当我在变量后添加空格字符时,它会删除最后一个数字的开头

for val in $(cat ~/Windows/Trash/bashReadingBehavior/trashFile.out)
do
    echo "$val  ";
done

输出:

123.234  
231.423  

1223.23  
  2.134

实际上,在最后一个数字之后添加的字符会写在最后一个数字的开头。我认为这是一个由不可见的字符引起的行为,如回车或类似的东西,但我无法弄清楚如何解决这个问题。

1 个答案:

答案 0 :(得分:3)

您的输入文件有DOS行结尾。执行时

echo "$val  "

$val的值以回车结束,当打印时,将光标移动到打印最后两个空格之前的行的开头,这可以覆盖行上已有的任何内容。

您应该使用以下代码从此文件中读取(不要遍历cat的输出):

while read; do
    REPLY=${REPLY%$'\r'}  # Remove the carriage return from the line
    for val in $REPLY; do
        echo "$val"
    done
done

使用我显示的for循环对一行进行迭代也不是真的值得推荐,但在这种情况下,如果从文件中读取并存储在REPLY中的行是已知是以空格分隔的数字列表。