高級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,560評論 9 467
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 1.Shell腳本 1.1 格式 首行 #!/bin/bash 指定解釋器 1.2 注釋 '#'開頭的行,'...
    keep_moving閱讀 1,253評論 4 45
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • Shell 快速指南 概述 什么是 shell Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux...
    靜默虛空閱讀 713評論 0 5