Shell腳本逐行讀取文本文件(不改變文本格式)
網(wǎng)上有很多 shell script 讀文本文件的例子,但是都沒(méi)有講出故事的全部,只說(shuō)了一半。舉個(gè)例子,比如從一個(gè) 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
最常見(jiàn)的一個(gè) line by line 讀取文件內(nèi)容的例子就是:
$ 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
這個(gè)例子的問(wèn)題是讀取文本行后,文本格式發(fā)生了變化,和原來(lái) testfile 文件的內(nèi)容不完全一致,空格字符自動(dòng)被刪除了一些。為什么會(huì)這樣呢?因?yàn)?IFS,如果在 shell script 里沒(méi)有明確指定 IFS 的話,IFS 會(huì)默認(rèn)用來(lái)分割空格、制表、換行等,所以上面文本行里多余的空格和換行都被自動(dòng)縮進(jìn)了。
如果想要輸出 testfile 文件原有的格式,把每行(作為整體)原封不動(dòng)的打印出來(lái)怎么辦?這時(shí)需要指定 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
上面兩種方法的輸出不是差不多嗎,有什么關(guān)系呢,第一種還美觀一些?關(guān)系重大,VPSee 昨天寫(xiě)了一個(gè)模擬 shell 的 C 程序,然后又寫(xiě)了一個(gè) shell script 來(lái)測(cè)試這個(gè) C 程序,這個(gè) script 需要從上面的 testfile 里讀取完整一行傳給 C 程序,如果按照上面的兩種方法會(huì)得到兩種不同的輸入格式,意義完全不同:
$./mypipe ls -a -l | sort | wc
$./mypipe "ls -a -l | sort | wc "
顯然我要的是第2種輸入,把 "ls -a -l | sort | wc " 作為整體傳給我的 mypipe,來(lái)測(cè)試我的 mypipe 能不能正確識(shí)別出字符串里面的各種命令。
如果不用 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
相關(guān)文章
Python創(chuàng)建、刪除桌面、啟動(dòng)組快捷方式的例子分享
這篇文章主要介紹了Python創(chuàng)建、刪除桌面、啟動(dòng)組快捷方式的例子分享,需要的朋友可以參考下2014-04-04awk 九九乘法表 shell實(shí)現(xiàn)代碼
這篇文章主要介紹了awk 九九乘法表 shell實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-03-03Linux查看系統(tǒng)時(shí)間的詳細(xì)方法總結(jié)
系統(tǒng)時(shí)間是計(jì)算機(jī)硬件和軟件運(yùn)行的基礎(chǔ),在Linux系統(tǒng)中,查看系統(tǒng)時(shí)間是一項(xiàng)基本任務(wù),本文將從多個(gè)方面介紹Linux查看系統(tǒng)時(shí)間的詳細(xì)方法,需要的朋友可以參考下2023-09-09Linux Shell腳本系列教程(一):Shell入門(mén)
這篇文章主要介紹了Linux Shell腳本系列教程(一):Shell入門(mén),本文講解了Shell簡(jiǎn)介、Shell基本操作、如何打開(kāi)Shell終端、Shell腳本的概念、如何運(yùn)行Shell腳本、Shell腳本的注釋等基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06Linux的打包壓縮與解壓縮---tar、xz、zip、unzip命令詳解
Linux 下一堆各式各樣的壓縮文件名:.gz、.tar.gz、tgz、bz2、.Z、.tar 等眾多的壓縮文件名,本文重點(diǎn)介紹Linux的打包壓縮與解壓縮---tar、xz、zip、unzip命令,感興趣的朋友一起看看吧2024-02-02shell Bash的數(shù)組與關(guān)聯(lián)數(shù)組的實(shí)現(xiàn)
本文主要介紹了shell Bash的數(shù)組與關(guān)聯(lián)數(shù)組的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Shell實(shí)現(xiàn)判斷進(jìn)程是否存在并重新啟動(dòng)腳本分享
這篇文章主要介紹了Shell實(shí)現(xiàn)判斷進(jìn)程是否存在并重新啟動(dòng)腳本分享,本文給出了兩個(gè)實(shí)現(xiàn)腳本,分簡(jiǎn)潔版和詳細(xì)版,需要的朋友可以參考下2014-09-09