引言
為什么要數(shù)量掌握bash編程,因為它是linux下的默認工具。任何時候與系統(tǒng)內(nèi)核對話,我們都直接面對shell。操作系統(tǒng)提供了為數(shù)眾多的便利工具,用于完成復雜的操作。
今天我們說一個最為常用的輸出字符串的指令 echo。
為什么說這個最常用的指令呢?因為很多人每天都在用。卻在使用過程中遇到了大大小小許許多多的坑而不可避免。今天我們通過一個問題,給出解決方案。帶領(lǐng)讀者深入的了解一下bash內(nèi)層的原理對echo的影響。
問題的提出
假如我們有一個文本文件 coder.txt,內(nèi)容如下:
Twinkle, twinkle, little star,
How I wonder what you are.
然后我們使用 cat 逐行打印這個文件,在終端中執(zhí)行以下指令:
cat coder.txt
輸出效果:
那么現(xiàn)在有一個需求,假如需要對每行文本做進一步的處理,在bash中使用for循環(huán)逐行處理。我們先這樣寫:
for f in `cat coder.txt`; do echo $f; done
我們預期會像cat指令一樣輸出兩行文本,但實際上不是這樣的。下面是輸出的情況:
可以注意到。每行文本中間有空格的地方,在打印的時候都會另起一行。
有沒有什么解決方案呢?
有人說你只需要在變量外層加上雙引號,就可以作為一行字符串處理了。事實會是這樣的嗎?我們測試一下。
可以看到雙引號對變量不起任何作用。
那么還有的同學,經(jīng)過參考man page之后,覺得應該給echo指令加上一些選項。比如下面這樣:
我們分別測試了 -e 選項,和 -ne 選項,發(fā)現(xiàn)都不行。
原理
之所以會產(chǎn)生上面的疑惑,根源還在于對bash腳本的一些固有解析方式原理的不夠了解。
下面我們直接給出解決方案。然后,分析為什么會起作用?
IFS=$'n'
for i in `cat coder.txt`; do echo "$i"; done
unset IFS
下面是運行效果:
可以注意到,本質(zhì)上循環(huán)打印沒有改變,只是在執(zhí)行前后對常量 IFS 進行了人為指定。
原來,bash循環(huán)默認使用空格作為分隔的依據(jù)。
我們只用手動指定 “n”換行符為分隔的依據(jù),就順利地原樣輸出了。
寫在最后
“書讀百遍,其義自見”!
多敲打,多參考 man page,可以讓基本功逐日增強。
HAppy coding :_)