找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15937|回复: 3

[问题求助] Shell逐行显示文本少了最后一行

[复制链接]
发表于 2019-6-25 11:09:09 | 显示全部楼层 |阅读模式
  1. #!/bin/bash
  2. while read LINE
  3. do
  4.     echo $LINE
  5. done < book.txt
复制代码
book.txt存放着

0000
0001
0002
0003
0004

为什么运行结果会少了最后一行,怎么修改可以全部显示出来。
发表于 2019-6-25 11:14:10 | 显示全部楼层
read  需要读到换行符才是读完一行。
0004 后面敲个回车。即最后一行留个空行。
发表于 2019-6-25 12:25:11 | 显示全部楼层
回复 2# cfwyy77_bat


我这边 CentOS 7 里面测试不留空行也没问题,你在什么系统里面测试能够重现楼主的问题呢?
发表于 2019-6-25 12:55:05 | 显示全部楼层
本帖最后由 cfwyy77_bat 于 2019-6-25 15:07 编辑

回复 3# Batcher


  我debian 9,  用read 重定向的方法,也是要留个空行。
以前我一直是这么认为的。
我也用虚拟机centos试了一下正常的。我又确认几次,大概知道原因在哪了。
首先 read 默认最后没读到换行符,不算成功读到一行,这个应该是确认的。
至于最后一行没输出原因应该是在编辑器。
vim 编辑文件保存的时候 vim 默认会在最后加上一个换行符,但视觉上你看不出有换行(看不出最后有空行),但用hd查看可以看到最后有一个自动加上去的换行符  0x0a
这时 用read 重定向的方法,所有前面的行都会正常输出。

而其它的编辑器 如 vscode,最后一行如果不敲回车,是不会自动加换行符的。所以最后一行不会输出。除非再手动再加个回车。
vscode上看 所见的和实际的一致,有回车就有一个空行,vim上 不是这样的,最后那个自动加上去的那个换行是不会显示成一个空行的 - -!

又查到了一个 POSIX标准对 行的标准定义,line
最后换行符是不可少的,这么看vim自动加换行符是有道理的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:40 , Processed in 0.017228 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表