今天遇到有人要寫一個從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
■
效果不錯。