2015-02-08 55 views
2

我知道read命令将IFS中的字符分割输入。因此,如果我将IFS设置为空格,那么输入到read命令时将使用空格作为分隔符。如下所示。IFS中的空白与IFS中的非空白之间的行为差​​异

[[email protected] ~]$ IFS=" " 
[[email protected] ~]$ read a b c 
foo bar baz qux 
[[email protected] ~]$ echo "$a" 
foo 
[[email protected] ~]$ echo "$b" 
bar 
[[email protected] ~]$ echo "$c" 
baz qux 

我期待,如果我做出改变IFS到非空白字符,也就是说,一个冒号和我输入使用冒号分隔符为,应该有任何变化。但事实证明这是错误的。例如,在下面的输出中,echo "$a"为空。为什么?

[[email protected] ~]$ IFS=: 
[[email protected] ~]$ read a b c 
:foo:bar:baz:qux 
[[email protected] ~]$ echo "$a" 

[[email protected] ~]$ echo "$b" 
foo 
[[email protected] ~]$ echo "$c" 
bar:baz:qux 
[[email protected] ~]# echo $c 
bar baz qux 

又为何的echo $c输出不包含冒号?

回答

1

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

由于空白是特别如POSIX2.6.5 Field Splitting)之一定义:

3a中。 IFS白色空间在输入的开始和结束时应该被忽略。

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

由于bash执行按照IFS之前传递barbazqux作为单独的参数echo字分裂(其仍然设置为:)。