IFS变量对加双引号和不加双引号变量的区别对待

1. IFS(Internal Field Seprator) 变量

IFS 变量是一个特殊的环境变量,叫做内部域分隔符。IFS 环境变量定义了 bash shell 用作字段分隔符的一系列字符。如果 bash shell 在数据中看到了这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。默认情况下 IFS 指定为空白符(即空格、tab 符、换行符)

2. IFS对待未加双引号的变量

比如在 bash shell 中输入以下代码:

1
2
3
IFS=:
_str_="hello:world"
for i in $_str_; do echo $i; done

会得到以下结果:

1
2
hello
world

原因是引用字符串变量 $_str_ 没有加双引号时,Shell 在 for 语句中根据 IFS 变量将字符串 $_str_ 进行切割,切割成很多个字符串,然后逐个 echo $i 输出。

3. IFS对待加双引号的变量

在 Shell 中输入以下代码:

1
2
3
IFS=:
_str_="hello:world"
for i in "$_str_"; do echo $i; done

会得到以下结果:

1
hello world

原因是引用字符串变量 $_str_ 加了双引号时,表示将其当作一个整体来处理,IFS 不会起作用,所以上述 for 循环只会循环一次。然后 echo $i 的时候由于 $i 未加双引号,故被 IFS 切割,但由于 echo 将其一起输出,故在同一行上。

所以可知,在 bash shell 中输入以下代码:

1
2
3
IFS=:
_str_="hello:world"
for i in "$_str_"; do echo "$i"; done

会得到以下结果:

1
hello:world

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!