本文转载自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 $*时,&代表分隔符,所以要转换成空格 ,而第二行由于""的作用使得&没有进行转换