IFS中的空白与IFS中的非空白之间的行为差​​异

时间:2015-02-08 18:01:51

标签: shell posix

我知道read命令通过IFS中的字符拆分输入。因此,如果我将IFS设置为空格,则使用空格作为分隔符来分割对read命令的输入。如下所示。

[lone@centos ~]$ IFS=" "
[lone@centos ~]$ read a b c
 foo bar baz qux
[lone@centos ~]$ echo "$a"
foo
[lone@centos ~]$ echo "$b"
bar
[lone@centos ~]$ echo "$c"
baz qux

我期待如果我将IFS更改为非空格字符,比如冒号并在我的输入中使用冒号作为分隔符,则行为应该没有变化。但事实证明这是错误的。例如,在下面的输出中,echo "$a"为空。为什么呢?

[lone@centos ~]$ IFS=:
[lone@centos ~]$ read a b c
:foo:bar:baz:qux
[lone@centos ~]$ echo "$a"

[lone@centos ~]$ echo "$b"
foo
[lone@centos ~]$ echo "$c"
bar:baz:qux
[lone@centos ~]# echo $c
bar baz qux

为什么echo $c的输出不包含冒号?

1 个答案:

答案 0 :(得分:1)

问题1:在下面的输出中,echo "$a"为空。为什么呢?

因为POSIX2.6.5 Field Splitting)中定义的空格是特殊的:

  

3A。在输入的开头和结尾都应忽略IFS空白区域。

问题2:为什么echo $c的输出不包含冒号?

由于bash在传递IFS之前根据:(仍然设置为bar执行分词,{{1 }和baz作为qux的单独参数。