我的印象是设置IFS
会改变将read
一行文本分隔为字段时使用的分隔符,但显然我遗漏了一些东西:
# OK: 'read' sees 3 items separated by spaces
$ (IFS=' '; x="aa bb cc"; echo "'$x'"; read a b c <<< $x;\
echo "'$a' '$b' '$c'")
'aa bb cc'
'aa' 'bb' 'cc'
# OK: 'read' sees a single item after IFS is changed
$ (IFS=','; x="aa bb cc"; echo "'$x'"; read a b c <<< $x;\
echo "'$a' '$b' '$c'")
'aa bb cc'
'aa bb cc' '' ''
# Why doesn't 'read' see 3 items?
$ (IFS=','; x="dd,ee,ff"; echo "'$x'"; read a b c <<< $x;\
echo "'$a' '$b' '$c'")
'dd,ee,ff'
'dd ee ff' '' ''
# OK: 'read' sees a single item when IFS is restored.
$ (IFS=' '; x="dd,ee,ff"; echo "'$x'"; read a b c <<< $x;\
echo "'$a' '$b' '$c'")
'dd,ee,ff'
'dd,ee,ff' '' ''
# OK: 'read' again sees 3 items separated by spaces.
$ (IFS=' '; x="gg hh ii"; echo "'$x'"; read a b c <<< $x;\
echo "'$a' '$b' '$c'")
'gg hh ii'
'gg' 'hh' 'ii'
为什么不IFS=','
将read
解析dd,ee,ff
为三个字段?