Shell指令碼逐行讀取文字檔(不改變文字格式設定)_linux shell

來源:互聯網
上載者:User

網上有很多 shell script 讀文字檔的例子,但是都沒有講出故事的全部,只說了一半。舉個例子,比如從一個 testfile 檔案中讀取如下格式的文本行:

複製代碼 代碼如下:

$ vi testfile
ls      -a -l /bin |  sort
ls      -a -l /bin |  sort | wc
ls      -a -l |  grep sh | wc
ls      -a -l
ls      -a -l |       sort      |    wc

最常見的一個 line by line 讀取檔案內容的例子就是:
複製代碼 代碼如下:

$ vi readfile
#!/bin/sh

testfile=$1
while read -r line
do
    echo $line
done < $testfile

$ chmod +x readfile
$ ./readfile testfile
ls -a -l /bin | sort
ls -a -l /bin | sort | wc
ls -a -l | grep sh | wc
ls -a -l
ls -a -l | sort | wc


這個例子的問題是讀取文本行後,文字格式設定發生了變化,和原來 testfile 檔案的內容不完全一致,空白字元自動被刪除了一些。為什麼會這樣呢?因為 IFS,如果在 shell script 裡沒有明確指定 IFS 的話,IFS 會預設用來分割空格、製表、換行等,所以上面文本行裡多餘的空格和換行都被自動縮排了。

如果想要輸出 testfile 檔案原有的格式,把每行(作為整體)原封不動的列印出來怎麼辦?這時需要指定 IFS 變數,告訴 shell 以 "行" 為單位讀取。

複製代碼 代碼如下:

$ vi readfile
#!/bin/sh

IFS=""

testfile=$1
while read -r line
do
    echo $line
done < $testfile

$ ./readfile testfile
ls      -a -l /bin |  sort
ls      -a -l /bin |  sort | wc
ls      -a -l |  grep sh | wc
ls      -a -l
ls      -a -l |       sort      |    wc    


上面兩種方法的輸出不是差不多嗎,有什麼關係呢,第一種還美觀一些?關係重大,VPSee 昨天寫了一個類比 shell 的 C 程式,然後又寫了一個 shell script 來測試這個 C 程式,這個 script 需要從上面的 testfile 裡讀取完整一行傳給 C 程式,如果按照上面的兩種方法會得到兩種不同的輸入格式,意義完全不同:
複製代碼 代碼如下:

$./mypipe ls -a -l | sort | wc
$./mypipe "ls -a -l | sort | wc "

顯然我要的是第2種輸入,把 "ls -a -l | sort | wc " 作為整體傳給我的 mypipe,來測試我的 mypipe 能不能正確識別出字串裡面的各種命令。

如果不用 IFS 的話,還有一種方法可以得到上面第二種方法的效果:

複製代碼 代碼如下:

#!/bin/sh

testfile=$1
x=`wc -l $testfile |awk '{print $1}'`

i=1
while [ $i -le $x ]
do
    echo "`head -$i  $testfile | tail -1`"
    i=`expr $i + 1`
done

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.