高级shell编程指南学习笔记(二)——由read命令引出的

今天遇到有人要写一个从log里滚动读取最新条目并且根据是否有前置空格输出到终端的脚本,问我怎么判断每行的前置空格,我先给了他一个思路:

if [[ $(echo $line | cut -b 1) -eq " " ]];then 
: 
else
:
fi

过了一会,他说试过了,怎么改都不行,于是我让他把脚本全部贴出来(这里我略做了改动):

#!/bin/bash
#space.sh
service_log=1.txt
tail -f  $service_log|while read line;do
if [[ $(echo $line|cut -c 1) -eq " " ]]
  then
        echo $line
fi
done

乍一看是没什么问题的,我试着运行了一下,做了一个1.txt:

#1.txt
1111111
  22222
   3333

输出的结果是这样的:

[root@test ~]# bash space.sh 
■

“■”处是光标

奇怪了,为什么明明有空格却不输出第二第三行呢。。。

if判断的逻辑肯定是没问题的,那么问题大概就出在read的过程了,于是百度了一下,果然,shell脚本中默认的IFS(内部域分隔符)是空白,所以read到的line中的空白都被替换掉,这是bash中对IFS为空白(空格,制表符,换行符)时的处理。

教材中对

$IFS

的说明可以归纳如下:

我要吐槽简书的md不支持流程图

于是在space.sh里面加了一条语句:

IFS=#
#任意非空的字符,确保不会出现在1.txt中

完整的脚本:

#!/bin/bash
#space.sh
service_log=1.txt
IFS=#
tail -f  $service_log|while read line;do
if [[ $(echo $line|cut -c 1) -eq " " ]]
  then
        echo $line
fi
done

运行结果如下:

[root@test ~]# bash space.sh 
  22222
   3333
■

效果不错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,746评论 9 468
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,292评论 19 139
  • 1.Shell脚本 1.1 格式 首行 #!/bin/bash 指定解释器 1.2 注释 '#'开头的行,'...
    keep_moving阅读 4,952评论 4 45
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,894评论 18 399
  • Shell 快速指南 概述 什么是 shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux...
    静默虚空阅读 3,938评论 0 5