最直接的方法是 array=($str),但需注意 $ifs 分割机制;安全推荐用 read -ra arr 处理含空格或特殊字符的字符串。

在 Linux Shell 中,把字符串按空格转为数组最直接的方法是用括号加未加引号的变量展开,即:array=($str)。但要注意这是基于 $IFS(内部字段分隔符)的词分割行为,实际使用中需兼顾安全性与兼容性。
基础写法:直接赋值(适用于简单场景)
当字符串不含特殊字符(如含空格的文件名、通配符 *、$ 等)时,可直接用:
str="apple banana cherry"
arr=($str)
echo "${arr[0]}" # 输出 apple
echo "${#arr[@]}" # 输出 3原理是 Bash 在未加引号的 $str 展开后,自动按 $IFS(默认含空格、制表符、换行符)做分割,并生成数组元素。
安全写法:用 read -ra(推荐用于含空格/特殊字符的输入)
若字符串来自用户输入、命令输出或可能含多余空白、通配符等,应避免直接展开。更健壮的方式是用 read:
str=" one two three " read -ra arr
-
-r防止反斜杠转义(如"a\ b"不会被误拆) -
-a arr表示将结果读入数组arr 是 here-string,确保整个字符串作为单次输入传递给 <code>read
注意 IFS 的影响
$IFS 控制分割行为。默认值是 space+tab+newline,但若被修改过(例如 IFS=:),arr=($str) 就会按冒号分,而非空格。必要时可临时重置:
str="a b c" old_ifs=$IFS IFS=' ' # 显式设为空格 arr=($str) IFS=$old_ifs
不过多数情况下,用 read -ra 更省心,它默认按原始 $IFS 工作,且不依赖外部变量状态。
不推荐:用 for 循环手动 push(冗余且易错)
不要这样写:
arr=()
for word in $str; do arr+=("$word"); done这本质仍是未加引号的 $str 展开,存在和 arr=($str) 同样的安全隐患,代码还更长,无额外收益。











