如何在 Bash 中将空格分隔的字符串读入数组?

问题描述 投票:0回答:6

我有一个包含空格分隔字符串的变量:

line="1 1.50 string"

我想用空格作为分隔符分割该字符串并将结果存储在数组中,以便以下:

echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}

输出

1
1.50
string

我在某个地方找到了一个不起作用的解决方案:

arr=$(echo ${line})

如果我在此之后运行上面的 echo 语句,我会得到:

1 1.50 string
[empty line]
[empty line]

我也尝试过

IFS=" "
arr=$(echo ${line})

结果相同。有人可以帮忙吗?

arrays string bash shell delimiter
6个回答
428
投票

为了将字符串转换为数组,请从字符串创建一个数组,让字符串根据

IFS
(内部字段分隔符)变量(默认为空格字符)自然分割:

arr=($line)

或使用

herestring
(read) 运算符将字符串传递到
<<<
命令的标准输入:

read -a arr <<< "$line"

对于第一个示例,至关重要的是not

$line
周围使用引号,因为这样可以将字符串拆分为多个元素。

另请参阅:https://github.com/koalaman/shellcheck/wiki/SC2206


60
投票

在:

arr=( $line )
。 “split”与“glob”相关联。
通配符(
*
?
[]
)将扩展为匹配的文件名。

正确的解决方案只是稍微复杂一点:

IFS=' ' read -a arr <<< "$line"

无通配问题;分割字符在

$IFS
中设置,引用变量。


58
投票

试试这个:

arr=(`echo ${line}`);

15
投票

如果需要参数扩展,请尝试:

eval "arr=($line)"

例如,采用以下代码。

line='a b "c d" "*" *'
eval "arr=($line)"
for s in "${arr[@]}"; do 
    echo "$s"
done

如果当前目录包含文件

a.txt
b.txt
c.txt
,则执行代码将产生以下输出。

a
b
c d
*
a.txt
b.txt
c.txt

0
投票

另一种解决方案,但使用

readarray

readarray -d ' ' arr <<< "argelia china denmark colombia"

确实,将输入存储在 4 个位置的数组中:

$ echo ${#arr[@]} ${arr[@]:1:2}
4 china  denmark 

-9
投票
line="1 1.50 string"

arr=$( $line | tr " " "\n")

for x in $arr
do
echo "> [$x]"
done
© www.soinside.com 2019 - 2024. All rights reserved.