zsh中控制字符串按空格分割的机制是什么?如何遍历空格分隔字符串?
控制zsh字符串按空格分割的核心参数
zsh 中控制未加引号的变量扩展是否自动按IFS(默认包含空格、制表符、换行符)分割的参数是 SH_WORD_SPLIT 选项,zsh 默认关闭该选项,这是和bash、sh行为不同的核心原因,和是否安装oh-my-zsh没有直接关联。
示例中其他异常的原因
- 你拿到
a[0]为空、a[1]为完整字符串的问题,除了没有触发分词以外,还因为zsh默认数组下标从1开始,若要对齐bash从0开始索引的行为,可以开启KSH_ARRAYS选项。 read写法不生效是因为zsh的read命令要将内容读入数组需要加-A参数,而非bash的-a参数。
解决方案
单次强制分词(无需修改全局配置)
在变量扩展时添加=标志,即可单次触发分词,适配原有逻辑:
s='foo bar baz' # 遍历场景 for i in ${=s}; do echo "$i END" done # 输出: # foo END # bar END # baz END # 数组赋值场景 a=( ${=s} ) echo ${a[1]} # foo echo ${a[2]} # bar
全局对齐bash行为
如果希望zsh默认和bash保持一致的分词、数组索引逻辑,可以在~/.zshrc中添加以下配置,重启终端后生效:
# 开启自动分词 setopt SH_WORD_SPLIT # 开启数组从0开始索引(可选,按需开启) setopt KSH_ARRAYS
read命令适配写法
s='foo bar baz' IFS=' ' read -r -A a <<< "$s" for i in "${a[@]}"; do echo "$i END" done
内容的提问来源于stack exchange,提问作者Charly
相关产品推荐
相关产品推荐

