1. 程式人生 > >shell中的IFS和$*變量

shell中的IFS和$*變量

連續 轉載 結果 字符串 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和$*變量