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

2017-11-14  本文已影响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
■

效果不错。

上一篇下一篇

猜你喜欢

热点阅读