shell脚本无法读取最后一行

不要到处宣扬自己的内心,

这世上不止你一个人有故事。

while read line无法读取最后一行

1
2
3
4
5
6
7

while read line
do
data=`...line...`
echo "${data}" >> $2.txt

done < $1

原因

因为我的目标文件是在windows下创建然后传到服务器上的,这样在利用while read line读取文件时,如果文件最后一行之后没有换行符\n,则read读取最后一行时遇到文件结束符EOF时循环即终止。上面代码中,虽然此时$line内存有最后一行的内容,但程序已经没有机会再处理此行内容,因此导致了最后一行无法读取。

解决

方案一

修改while循环,增加 [[ -n ${line} ]],这样当文件没有到最后一行时不会测试-n $line,当遇到文件结束(最后一行)时,仍然可以通过测试$line是否有内容来进行继续处理。

1
2
3
4
5
6
#!bin/bash
while read line || [[ -n ${line} ]]
do
data=`...line...`
echo "${data}" >> $2.txt
done < $1

方案二

通过分析原因可知,本质原因是因为文件格式不是unix导致的,可以直接通过设置文件格式来处理,该方式则脚本代码不需改动。

1
2
3
4
5
6
7
8
9
10

# 在服务器上vim编辑目标文件
vim target_file

# 然后执行如下指令,用于查看当前文件是dos格式还是unix格式
:set ff?

# 强制切换为unix格式,然后保存即可
:set ff=unix