我知道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
的输出不包含冒号?
答案 0 :(得分:1)
问题1:在下面的输出中,echo "$a"
为空。为什么呢?
因为POSIX(2.6.5 Field Splitting
)中定义的空格是特殊的:
3A。在输入的开头和结尾都应忽略IFS空白区域。
问题2:为什么echo $c
的输出不包含冒号?
由于bash
在传递IFS
之前根据:
(仍然设置为bar
)执行分词,{{1 }和baz
作为qux
的单独参数。