Bash Shell脚本:如何在Windows上读取不以换行符结尾的文本文件

Bash Shell脚本:如何在Windows上读取不以换行符结尾的文本文件,bash,shell,Bash,Shell,下面的程序读取一个文件,它打算将所有值(每行)存储到一个变量中,但不存储最后一行。为什么? file.txt: 代码: FileName=file.txt 如果测试-f$FileName#检查文件是否存在 然后 而read-r行 做 fileNamesListStr=“$fileNamesListStr$line” 完成file.txt。谢谢jordanm。在这两种情况下都可以工作,文件是否以新行结尾。非常感谢您的时间和您提供的解决方案。在内存空间和访问存储数据方面,哪一个是有效的空格分隔字符串

下面的程序读取一个文件,它打算将所有值(每行)存储到一个变量中,但不存储最后一行。为什么?

file.txt:

代码:

FileName=file.txt
如果测试-f$FileName#检查文件是否存在
然后
而read-r行
做
fileNamesListStr=“$fileNamesListStr$line”
完成<$FileName
fi
回显“$FileNameListStr”//1 2 3。。。。。n-1(但应打印到n)

一个可能的原因是在最后一行
n
之后遗漏了换行符

使用以下命令进行检查:

tail -1 file.txt
以及以下修复程序:

echo >> file.txt
如果您真的需要保留最后一行而不使用换行符,我在这里重新组织了
while
循环

#!/bin/bash
FileName=0
if test -f $FileName ; then
    while [ 1 ] ; do    
        read -r line
        if [ -z $line ] ; then
            break
        fi
        fileNamesListStr="$fileNamesListStr $line"
    done < $FileName
fi
echo "$fileNamesListStr"
#/bin/bash
文件名=0
如果测试-f$FileName;然后
而[1];做
read-r行
如果[-z$行];然后
打破
fi
fileNamesListStr=“$fileNamesListStr$line”
完成<$FileName
fi
回显“$FileNameListStr”

与其逐行读取,为什么不一次读取整个文件

[ -f $FileName ] && fileNameListStr=$( tr '\n' ' ' < $FileName )
[-f$FileName]&&fileNameListStr=$(tr'\n'<$FileName)

问题在于,当文件没有换行结束时,read返回非零,循环不会继续。read命令仍将读取数据,但不会处理循环。这意味着您需要在循环之外进行进一步的处理。您可能还希望使用数组而不是空格分隔的字符串

FileName=file.txt

if test -f $FileName         # Check if the file exists
    then
        while read -r line
        do    
            fileNamesListArr+=("$line")

        done < $FileName

        [[ -n $line ]] && fileNamesListArr+=("$line")
fi

echo "${fileNameListArr[@]}"
如果测试-f$FileName#检查文件是否存在
然后
而read-r行
做
fileNamesListArr+=(“$line”)
完成<$FileName
[[-n$line]&&fileNamesListArr+=(“$line”)
fi
回显“${fileNameListArr[@]}”
请参阅本文的“我的文本文件已损坏!它们缺少最后的换行符!”部分:

作为一种解决方法,在读取文本文件之前,可以在文件中添加换行符

echo "\n" >> $file_path

这将确保读取文件中以前的所有行。现在可以逐行读取文件。

您的文件是否以新行结尾?@jackrabbit:不。实际上大多数客户端都不知道,他们编写文件时没有以新行结尾。因此,我正在寻找这样的解决方案,这应该在两种情况下都有效。谢谢你的时间。如果我使用
tail-1 file.txt
则它返回最后一行(
n
)文件是否以新行结尾,
echo>>file.txt
在文件末尾添加一个新的空行,无论文件是否以新行结尾。因此,我认为它在我的情况下没有多大用处,我想先检查一下,文件是否以新行结尾
不做任何事情
。else
echo>>file.txt
。谢谢jordanm。在这两种情况下都可以工作,文件是否以新行结尾。非常感谢您的时间和您提供的解决方案。在内存空间和访问存储数据方面,哪一个是有效的
空格分隔字符串与数组字符串
。@user1010399我的解决方案的好处是它可以处理包含空格的文件中的文件名,而其他的则不能。我不确定RAM的差异,但很可能可以忽略不计。如果你想减少一点内存使用和速度,那么你使用了错误的语言。+100!谢谢乔丹。基本上,我是一名java程序员,对shell脚本没有太多想法。再次感谢。非常出色和高效:)+100另外,如果文件丢失,我想发出通知???@user1010399,然后使用带有
else
子句的
if
语句。
if test -f $FileName         # Check if the file exists
    then
        while read -r line
        do    
            fileNamesListArr+=("$line")

        done < $FileName

        [[ -n $line ]] && fileNamesListArr+=("$line")
fi

echo "${fileNameListArr[@]}"
echo "\n" >> $file_path