bash: `read` 似乎不支持 IFS

标签 bash string-parsing ifs

我的印象是设置 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=',' 不让 readdd,ee,ff 解析为三个字段?

最佳答案

# 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' '' ''

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

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

编辑:当未引用变量时,扩展会导致 Word Splitting :

The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not occur within double quotes for word splitting.

关于bash: `read` 似乎不支持 IFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20948935/

相关文章:

linux - 如何在 Bash 子 shell 中执行 shell 脚本?

Python解析包含函数、列表和字典的字符串

python - 使用 Python 读取 CSV 文件的值

linux - printf\'<a>\' 给出错误 - 找不到指定的文件

linux - 如何对目录中的所有文件运行命令,并将 mv 运行到获得包含 'Cannot read TIFF header' 输出的不同文件?

Linux X session 脚本

bash - 使用 IFS bash 进行 CSV 解析 : choose ";" as the separator

c - 如何在c编程中将出生日期格式作为字符串输入

arrays - 在 bash 中使用 IFS 单词分隔符将字符串按 'read' 拆分为数组如何生成额外的空格元素?

arrays - Bash:使用 IFS 将数组连接成字符串