bash:`read`似乎不尊重IFS

Ada*_*iss 2 bash ifs string-parsing

我的印象是设置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'
Run Code Online (Sandbox Code Playgroud)

为什么不IFS=','作出read解析dd,ee,ff成三场?

dev*_*ull 6

# 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' '' ''
Run Code Online (Sandbox Code Playgroud)

因为你没有引用你的变量.

$ ( IFS=','; x="dd,ee,ff"; echo "'$x'"; read a b c <<< "$x";\
  echo "'$a' '$b' '$c'")
'dd,ee,ff'
'dd' 'ee' 'ff'
Run Code Online (Sandbox Code Playgroud)

编辑:当没有引用变量时,扩展会导致Word拆分:

shell扫描参数扩展,命令替换和算术扩展的结果,这些结果在双引号内没有出现用于分词.

  • 您应该解释当`$ x`被扩展时正在使用`IFS`. (3认同)