一、Shell脚本:while read line无法读取最后一行的问题

今天利用shell脚本处理园区bucket信息时,发现在脚本中使用while read line循环逐行读取文件时总是无法处理到最后一行,脚本大致执行流程源码如下,通过while循环逐行读取命令行第一个参数指定的文件,并对数据进行处理后输出。

#!bin/bash
while read line
dodata=`...line...`echo "${data}" >> $2.txt
done < $1

经过简单的查询学习后,将该问题的背景、原因、解决方案整理如下第二章节。

二、背景、原因及解决方案

1、背景

在计算机出现之前,使用的电传打字机(Teletype Model)每秒可以打10个字符。但是它的问题是打完一行后换行要用去0.2秒,正好可以打两个字符。若在这0.2秒内又有新的字符传过来,那么这个字符将丢失。

于是研发人员想了个办法,就是在每行后面加两个表示结束的字符。一个叫做"回车"(Carriage Return),告诉打字机把打印头定位在左边界;另一个叫做"换行"(Linefeed),告诉打字机把纸向下移一行。这就是"换行"和"回车"的来历。

计算机发明后这两个概念也就被采用,但那时存储器很贵,部分研究人员认为在每行结尾加两个字符太浪费了,加一个就可以,于是就出现了分歧。

Unix及Unix系统里,每行结尾只有"<换行>",即"\n";Windows系统里面,每行结尾是"<回车><换行>",即"\r\n"。一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号。

Windows下新建文件,最后一行不会添加回车符或换行符;而linux新建的文件,最后一行还会添加1个换行符。

2、原因:

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

3、方案一:

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

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

4、方案二:

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

# 在服务器上vim编辑目标文件
vim target_file# 然后执行如下指令,用于查看当前文件是dos格式还是unix格式
:set ff?# 强制切换为unix格式,然后保存即可
:set ff=unix
:wq

【Linux】Shell脚本:while read line无法读取最后一行???相关推荐

  1. linux while read文件,linux shell脚本用while read逐行读取文本的问题

    问题: 我现在是想用一个脚本获取一定列表服务器的运行时间.首先我建立一个名字为ip.txt的IP列表(一个IP一行),再建好密钥实现不用密码直接登录.然后写脚本如下:#!/bin/bashwhile ...

  2. Linux shell 脚本编程-实战篇(二)

    继: Linux shell 脚本编程-实战篇(一) 2. 创建与数据库.Web及电子邮件相关的脚本 2.1 MySQL 数据库 2.1.1 MySQL 数据库安装 到 http://repo.mys ...

  3. 100个Linux Shell脚本经典案例

    kill `ps -ef | grep redis | awk '{print $2}'` grep -w '\|aa\|bb'​​​​​​​ Linux 根据端口号杀进程的.sh脚本_xie_app ...

  4. LINUX SHELL脚本攻略笔记[速查]

    LINUX SHELL脚本攻略笔记[速查] Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgr ...

  5. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  6. linux运维实战练习及linux shell脚本、awk、sed工具命令学习总结

    一.linux shell 脚本 1.描述shell程序的运行原理(可附带必要的图形说明): Linux系统的shell作为操纵系统的外壳,为用户提供使用操纵系统的接口.它是命令语言.命令解释程序及程 ...

  7. linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法

    这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...

  8. linux下实用小脚本,十个增加 Linux Shell 脚本趣味的小工具

    很多人误以为shell脚本只能在命令行下使用.其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等.你可以控制最终的输出,光标位置还有各种输出效果.下面我将介绍一些工具,帮助你创建强大 ...

  9. linux sh脚本 while,Linux shell脚本使用while循环执行ssh的注意事项

    原标题:Linux shell脚本使用while循环执行ssh的注意事项 如果要使用ssh批量登录到其它系统上操作时,我们会采用循环的方式去处理,那么这里存在一个巨大坑,你必须要小心了. 一.场景还原 ...

  10. Linux shell脚本编程(三)

    Linux shell脚本编程 -------------------------------------------------------------------- 注:如果你对python感兴趣 ...

最新文章

  1. 水平越权访问与垂直越权访问漏洞
  2. mysql的慢查询日志
  3. VS2017 + cmake 3.7 + opencv 3.2 编译
  4. Ansible自动化运维应用场景分析
  5. boost::fusion::unfused用法的测试程序
  6. JDK8-lambda表达式四种forEach性能对比
  7. python 替换array中的值_利用Python提取视频中的字幕(文字识别)
  8. React开发(218):dva注意对应
  9. Spring Boot使用Poi将Excel导入进数据库
  10. 【1138】数据结构上机测试2-1:单链表操作A(顺序建表+删除节点)(SDUT)
  11. 鸿蒙2秒开机官方,两款荣耀智慧屏发布:鸿蒙OS首秀2秒开机,安卓应用迁移不难...
  12. 覆盖电商、推荐、ETL、风控等多场景,网易的实时计算平台做了啥?
  13. 群晖Video Staiton套件 安卓TV端使用教程
  14. 如何进行App推广以及广告推送
  15. 隐私公链背景的FAIRY SWAP,让DEX更进一步
  16. toms 尺寸 shoes or boots finds
  17. php 日期format不要零_DateFormat PHP Class (php 处置日期)
  18. 如何实现电脑远程开机
  19. VR/AR的需求和前景
  20. FFmpeg —— MP4转FLV(带关键帧)

热门文章

  1. 计算机太极之光,且看今朝,刚柔并济,叱咤风云
  2. Jenkins——Jenkins+harbor+gitlab(git) 部署maven项目
  3. Java使用微软Exchange邮箱发送与接收邮件
  4. wamp5 mysql 默认密码_WAMP中的mysql设置密码(默认密码为空)及phpmyadmin的配置
  5. mysql支持的时区列表_5.1.14 MySQL服务器时区支持
  6. mac word 2016中文输入问题解决
  7. 网站建设之帝国cms搭建小技巧详细搭建配置教程
  8. 人工智能笔记之专业选修课4.1.5 - 博弈论 7.极大极小策略,相关均衡
  9. php amr时长,amr是什么文件
  10. 1487 C. Minimum Ties