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

4si2a6ki  于 2023-10-23  发布在  Shell
关注(0)|答案(6)|浏览(260)

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

line="1 1.50 string"

我想把这个字符串用空格作为分隔符进行分割,并把结果存储在一个数组中,这样就可以:

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

输出

1
1.50
string

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

arr=$(echo ${line})

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

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

结果是一样的有人能帮帮忙吗

ztigrdn8

ztigrdn81#

为了将字符串转换为数组,从字符串创建一个数组,让字符串根据IFS(内部字段分隔符)变量自然分割,该变量默认为空格字符:

arr=($line)

或者使用herestring<<<)运算符将字符串传递给read命令的标准输入:

read -a arr <<< "$line"

对于第一个例子,在$line周围使用引号是至关重要的,因为这允许字符串被拆分为多个元素。
标签:https://github.com/koalaman/shellcheck/wiki/SC2206

u5rb5r59

u5rb5r592#

In:arr=( $line ) .“分裂”与“球”有关。
通配符(*?[])将扩展为匹配的文件名。
正确的解决方案只是稍微复杂一点:

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

无结球问题;分割字符在$IFS中设置,变量用引号括起。

e5nszbig

e5nszbig3#

试试这个:

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

sh7euo9m4#

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

eval "arr=($line)"

例如,以下面的代码为例。

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

如果当前目录包含文件a.txtb.txtc.txt,则执行代码将产生以下输出。

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

m4pnthwp5#

另一种解决方案,但使用readarray

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

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

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

vybvopom6#

line="1 1.50 string"

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

for x in $arr
do
echo "> [$x]"
done

相关问题