在Bash中将分隔的字符串读入数组

时间:2012-02-15 12:59:07

标签: arrays string bash shell

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

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})

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

5 个答案:

答案 0 :(得分:285)

要将字符串转换为数组,请使用

arr=($line)

read -a arr <<< $line

不要使用引号至关重要,因为这样可以解决问题。

答案 1 :(得分:37)

试试这个:

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

答案 2 :(得分:23)

在: conn.Execute "INSERT INTO OH_TEST_TABLE (EQUIPID, TYPE, NAME) select * from (values ('" & sequipid & "','" & stype & "','" & sname & "') ) tmp(a,b,c) where not exists (select * from OH_TEST_TABLE where EQUIPID='" & sequipid & "')" 。 &#34;分裂&#34;来自&#34; glob&#34; 通配符(arr=( $line )*?)将扩展为匹配的文件名。

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

[]

没有全球性问题;拆分字符在IFS=' ' read -a arr <<< "$line" 中设置,引用变量。

答案 3 :(得分:3)

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

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

答案 4 :(得分:-9)

line="1 1.50 string"

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

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