shell 脚本中未读取文件的最后一行

No *_*ame 3 shell file

我有一个文本文件foo.txt,其中包含以下文本作为内容,

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

我有一个 shell 脚本,

file="foo.txt" 
while IFS= read -r line
do
   echo "$line"
done < "$file"
Run Code Online (Sandbox Code Playgroud)

但这仅打印到4.

实际输出:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

如何获得如下预期输出?

预期输出:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 6

这是由于输入文件最后一行缺少换行符。

您可以使用此循环来读取所有内容:

while IFS= read -r line || [ -n "$line" ]; do
    echo "$line"
done < "$file"
Run Code Online (Sandbox Code Playgroud)

对于没有换行符的最后一行,read不会返回成功,因此[ -n "$line" ]会进行检查以确保在$line不为空时打印它。

PS:如果您不介意更改输入文件,则可以使用printf以下命令附加换行符:

printf '\n' >> "$file"
Run Code Online (Sandbox Code Playgroud)

然后正常读取:

while IFS= read -r line; do
    echo "$line"
done < "$file"
Run Code Online (Sandbox Code Playgroud)