以下程序读取文件,它打算将所有值(每行)存储到变量中,但不存储最后一行。为什么呢?
file.txt :
1
2
.
.
.
n
代码:
FileName=file.txt
if test -f $FileName # Check if the file exists
then
while read -r line
do
fileNamesListStr="$fileNamesListStr $line"
done < $FileName
fi
echo "$fileNamesListStr" // 1 2 3 ..... n-1 (but it should print up to n.)
答案 0 :(得分:4)
为什么不一次阅读整个文件而不是逐行阅读?
[ -f $FileName ] && fileNameListStr=$( tr '\n' ' ' < $FileName )
答案 1 :(得分:3)
一个可能的原因是在最后一行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"
答案 2 :(得分:1)
问题是当文件没有以换行符结尾时,read返回非零值并且循环不会继续。 read命令仍然会读取数据,但不会处理循环。这意味着您需要在循环外进行进一步处理。您可能还需要一个数组而不是空格分隔的字符串。
文件名= 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[@]}"
请参阅“我的文本文件已损坏!它们缺少最终的换行符!”本文的部分: http://mywiki.wooledge.org/BashFAQ/001
答案 3 :(得分:0)
作为一种解决方法,在从文本文件中读取之前,可以将换行符附加到文件中。
echo "\n" >> $file_path
这将确保读取文件中先前存在的所有行。现在可以逐行读取文件。