本文轉載自http://blog.chinaunix.net/uid-22566367-id-381955.html
不得不說shell裡面的全域變數都是些噁心的傢伙,特別是這傢伙----IFS,噁心之極,差點被它忽悠過去了,所以趕快記錄下來,以免下次再被忽悠!!!
STRING1="111 222 333 444"
echo $STRING1
echo "$STRING1"
這組代碼沒什麼好說的,輸出的是:111 222 333 444,它的作用是和下面那段做對比!!
STRING2="111 222 333 444"
echo $STRING2
echo "$STRING2"
輸出的結果是
111 222 333 444
111 222 333 444
為什嗎?? 第一個輸出的結果明顯不對,難道輸出了的是STRING1的值,明顯不可能,這就是IFS的鬼伎倆。。。
首先介紹一下這個傢伙,IFS是shell內定的一個變數,預設定義的值為 <space> <tab> <newline>3個,不好意思,這3個值我打出來也看不見,只能寫英文。那IFS的作用是什麼了,它的作用就是把字串裡的某某字元(和 它一樣的字元,例如上面的<space> <tab> <newline>)轉義成分隔字元
例如"111 222 333 444",這個字串其實就是 111<space>222<space><space>333<space><space><space>444, 由於IFS裡也有個<space>,所以在它眼中<space>就是分隔字元,所以"111 222 333 444"在它看來就是這個鬼樣子111<分隔字元>222<分隔字元><分隔字元>333<分隔字元>< 分隔字元><分隔字元>444,由於分隔字元(不是所有的分隔字元都會合并,空格是個例外)進行合并,所以就成了111<分隔 符>222<分隔字元>333<分隔字元>444,而這該死的<分隔字元>偏偏顯示出來和一個空格是一樣的(或者說
空格被用來表示分隔字元),所以顯示出來就變成了"111 222 333 444"怎麼樣? 鬱悶吧
所以 echo $STRING2 顯示出來的是"111 222 333 444",echo "$STRING2"之所以還是保持原樣是因為""它屏蔽了IFS的功能,才未遭其迫害!!
如果我這樣改下,結果就一樣了,這時候shell就不會認為空白格是分隔字元了,倒是&符號要倒黴了 呵呵。。。
IFS='&'
STRING2="111 222 333 444"
echo $STRING2
echo "$STRING2"
另外還有個$*的全域變數,它和IFS狼狽為奸,盡幹壞事,今天也揭下老底!!
$*指的是指令碼入口參數的字串集,說也說不清楚,舉個例子
你在終端輸入一個指令碼,帶了3個參數,這樣
./script 111 222 333
那麼 echo $*輸出的就是111 222 333,這沒什麼問題,但是下面的東西就又忽悠人了
首先是這段代碼
IFS='&'
STRING2="111&222&&333&&&444"
echo $STRING2
echo "$STRING2"
這輸出的是
111 222 333 444
111&222&&333&&&444
經過上面的解釋,這個忽悠不到人-----因為IFS='&',所以字串裡的&全成了分隔字元,所以第一個輸出的是111 222 333 444,後面還有一組代碼
現在終端運行./script 111 222 333 444
IFS='&'
echo $*
echo "$*"
輸出的是
111 222 333 444
111&222&333&444
我來解釋一下是為什麼
因為$*等於111IFS222IFS333IFS444,亦等於111&222&333&444,由於echo $*時,&代表分隔字元,所以要轉換成空格 ,而第二行由於""的作用使得&沒有進行轉換