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

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

作者: 耗子在简书 | 来源:发表于2017-11-14 00:16 被阅读0次

    今天遇到有人要写一个从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
    ■
    

    效果不错。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/mfatvxtx.html