为何IFS在bash中工作正常,在zsh中无法按预期拆分字符串?
zsh与bash下IFS字符串拆分行为不一致的原因
- zsh默认关闭了*未加引号的参数扩展后的单词拆分(word splitting)*特性,这是zsh的原生设计,目的是减少bash中常出现的因意外拆分带空格的文件名、路径等导致的bug,和bash默认遵循的POSIX行为存在差异。
- 示例中
set $LINE的写法在zsh中运行时,$LINE即使没有包裹引号也不会被IFS=:拆分,整个字符串会被作为唯一的位置参数$1赋值,$2、$3、$4均为空值,因此会出现和bash运行结果不一致的表现。
适配zsh的解决方案
如果要在zsh中实现和bash一致的IFS拆分效果,有两种常用方案:
- 显式为需要拆分的变量添加
=标记,告知zsh对该变量执行单词拆分:
#!/bin/zsh LINE="I:would:like:coffee." IFS=: set ${=LINE} # 加=触发展开后的IFS拆分 echo $1 echo $2 echo $3 echo $4 exit 0
- 全局开启
shwordsplit选项,让当前脚本的单词拆分行为和POSIX标准(bash默认行为)对齐:
#!/bin/zsh setopt shwordsplit # 开启单词拆分特性 LINE="I:would:like:coffee." IFS=: set $LINE echo $1 echo $2 echo $3 echo $4 exit 0
以上两种方案运行后,都会输出和bash执行一致的拆分结果。
内容的提问来源于stack exchange,提问作者Animal Farm
相关产品推荐
相关产品推荐

