IFS表示 Internal Field Separator (内部字段分隔符)

$IFS

在Linux下写下如下脚本:
test1.sh

string1="1 2 3 4"
echo $string1
echo "$string1"

输出:

1 2 3 4
1 2 3 4

test2.sh

string2="1  2  3  4"
echo $string2
echo "$string2"

输出:

1 2 3 4
1 2 3 4

这是因为​​$IFS​​默认是空字符(空格Space、Tab、换行\n),把相邻的连续的分割符合并到了一起。而利用双引号包裹的字符串实际上是屏蔽了IFS的作用,当我做如下修改的时候那么输出就完全一致了。

IFS='-'
string2="1 2 3 4"
echo $string2
echo "$string2"

这样就一样了:

1  2  3  4
1 2 3 4

再证明一下:

IFS='-'
string2="1--2--3--4"
echo $string2
echo "$string2"

输出:

1  2  3  4
1--2--3--4

影响$*

​$*​​​和​​$@​​​都是返回所有参数。
test2.sh

IFS="&"
echo $*
echo "$*"
echo $@
echo "$@"

运行​​bash test3.sh 1 2 3​​输出:

1 2 3
1&2&3
1 2 3
1 2 3

​$*​​​将所有的参数认为是一个字段.
​​​$@​​以IFS(默认为空格)来划分字段,如果空格在 “”里面则不不划分。