MacOS 11.6.1下zsh字符串分割报错及索引异常问题求助
在macOS 11.6.1的zsh环境中分割字符串的问题
我在macOS 11.6.1的zsh环境里需要按分隔符分割字符串,参考了Bash的字符串分割方法,试了两种写法:
第一种写法:
IN="bla@some.com;john@home.com" IFS=';' read -ra ADDR <<< "$IN" for i in "${ADDR[@]}"; do # process "$i" done
第二种写法:
IN="bla@some.com;john@home.com" while IFS=';' read -ra ADDR; do for i in "${ADDR[@]}"; do # process "$i" done done <<< "$IN"
这两种写法都报错:bad option: -a。
之后尝试参数展开的方式:
IN="bla@some.com;john@home.com" arrIN=(${IN//;/ }) echo ${arrIN[1]} # 预期输出: john@home.com
实际输出却是bla@some.com john@home.com,不是预期的结果,请问哪里操作错了?
问题原因与解决方法
1. 关于read -a报错的问题
zsh的read命令不支持Bash特有的-a选项(该选项用于将读取内容存入数组),需要改用zsh专属的-A选项(大写)来实现相同功能。修改后的代码如下:
IN="bla@some.com;john@home.com" IFS=';' read -rA ADDR <<< "$IN" for i in "${ADDR[@]}"; do # 处理每个元素,示例为打印 echo "$i" done
对应的while循环版本:
IN="bla@some.com;john@home.com" while IFS=';' read -rA ADDR; do for i in "${ADDR[@]}"; do # 处理每个元素,示例为打印 echo "$i" done done <<< "$IN"
2. 关于参数展开未正确分割数组
你原来的写法依赖字符串替换和默认分词,不仅容易受特殊字符干扰,还忽略了zsh的数组索引规则:zsh数组默认从1开始索引,而非Bash的0起始。正确的zsh分割字符串为数组的方法有两种:
- 方法一:使用zsh专属的分词语法
${(@s:分隔符:)}变量名
IN="bla@some.com;john@home.com" arrIN=("${(@s:;:)}IN") echo ${arrIN[2]} # 输出 john@home.com
- 方法二:临时修改IFS后直接展开变量
IN="bla@some.com;john@home.com" IFS=';' arrIN=($IN) echo ${arrIN[2]} # 输出 john@home.com
你之前的写法arrIN=(${IN//;/ })未得到预期结果,一是因为误将数组索引当成0起始,二是这种替换空格后分词的方式不够可靠,容易受zsh默认分词规则影响。
内容的提问来源于stack exchange,提问作者ecjb
相关产品推荐
相关产品推荐

