最常用、最可靠的方式是用 ifs配合read -ra安全分割:临时设置ifs,用-ra选项将逗号分隔的字符串str="apple,banana,cherry,dates"读入数组fruits。

Shell 中把长字符串按指定分隔符切分成数组,最常用、最可靠的方式是用 IFS(Internal Field Separator)配合 read 或直接赋值,而不是依赖不稳定的 for 循环或 awk 的数组模拟。
用 IFS + read -ra 安全分割(推荐)
这是 POSIX 兼容、能正确处理空字段和含空格字段的首选方法。关键点:临时设置 IFS,用 -ra 选项将结果读入数组。
-
语法示例:
str="apple,banana,cherry,dates"
IFS=',' read -ra fruits
这样fruits就是包含 4 个元素的数组,${fruits[0]}是apple,${#fruits[@]}返回长度。 - 注意 IFS 只在
read命令这一行生效,不影响后续环境;-r防止反斜杠转义,-a指定数组名。 - 如果字符串末尾有分隔符(如
"a,b,c,"),默认会多出一个空元素;需要过滤可加grep -v '^$'预处理,或用循环去空。
用 IFS + 括号赋值(简洁但需谨慎)
适用于简单场景,但 IFS 会影响后续未加保护的单词分割,务必及时恢复或限制作用域。
-
安全写法(子 shell 或局部作用域):
(IFS=';'; arr=( $str ))
括号启动子 shell,IFS 变更不会污染父环境。 -
不推荐全局改 IFS:
old_ifs=$IFS; IFS=':'; arr=( $str ); IFS=$old_ifs
容易遗漏恢复,尤其在函数中易引发隐性 bug。
避免常见陷阱
很多写法看似可行,实际有隐患:
- 别用 for word in $str:它依赖空白分割,无视自定义分隔符,且会意外拆开带空格的字段。
- 别直接用 awk 'BEGIN{FS=","}{print $1,$2}':awk 本身不导出 Shell 数组,只能输出文本,再解析就绕远路又易错。
-
空分隔符不可用:IFS 为空时按空白分割,不是“逐字符”,想按空字符切要用其他工具(如
fold -w1)。
处理特殊分隔符(如空格、制表符、斜杠)
分隔符是空白字符(空格、tab、换行)时,IFS 默认已支持;若是其他字符(如 /、|),直接赋值即可:
- path="/usr/local/bin"
IFS='/'; read -ra parts →parts得到"" "usr" "local" "bin"(开头空字段对应根目录) - 若要忽略开头/结尾空字段,可在分割后用循环清理:
fruits=("${fruits[@]#/}") # 去前导 /,但更推荐预处理字符串











