shell中的IFS和$*變量
阿新 • • 發佈:2017-09-03
連續 轉載 結果 字符串 logs cnblogs col tracking ring1
本文轉載自http://blog.chinaunix.net/uid-22566367-id-381955.html
自我記錄內容。在工程中遇到了相關內容的shell腳本。在此處記錄
STRING1="111 222 333 4444" echo $STRING1 echo "$STRING1"
兩段代碼的輸出都是
111 222 333 4444
第二段代碼
STRING2="111 222 333 444" echo $STRING2 echo "$STRING2"
輸出結果:
111 222 333 444 111 222 333 444
其原因是IFS這個變量的緣故:IFS是shell內定的一個變量,默認定義的值為<space><tab><newline>3個,IFS的作用就是把字符串裏面的某某字符(和它一樣的字符,例如上面的<space>,<tab> <newline> 轉義為分隔符,例如上述的字符串實際上為
111<space>222<space>333<space><space><space>444
由於IFS裏面也有一個<spce>,所以在他眼中<space>就是分隔符,其把相鄰的連續的分割符合並到了一起。而利用雙引號包裹的字符串實際上是屏蔽了IFS的作用,當我做如下修改的時候那麽輸出就完全一致了
IFS=‘&‘ STRING2="111 222 333 444" echo $STRING2 echo "$STRING2"
另外一個變量是$*,其指的是腳本入口參數的字符串集合。舉例如下:
在終端輸入了一個命令,如下:
./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,後面還有一組代碼。(另外註意並不是所有的分割符都會合並。其中比如空格space就會合並)
現在在終端運行
./script 111 222 333 444 IFS=‘&‘ echo $* echo "$*"
其輸出是
111 222 333 444 111&222&333&444
因為$*等於111IFS222IFS333IFS444,亦等於111&222&333&444,由於echo $*時,&代表分隔符,所以要轉換成空格 ,而第二行由於""的作用使得&沒有進行轉換
shell中的IFS和$*變量