bash while包含空格的数组

时间:2015-03-12 17:19:51

标签: arrays bash

我得到了以下代码。我想将cc dd ee ff作为数组[2]

    keyvariable="aa bb cc dd ee ff"
    while read -a line;
    do
       a=$(echo "${line[0]}")
       b=$(echo "${line[1]}")
       c=$(echo "${line[2]}")
    done <<< "$keyvariable" 
    echo "$a $b $c"

当前输出:

      aa bb cc   

我想得到以下输出,其中aa是[0] bb是[1]而cc dd ee是[2]

      aa bb cc dd ee

3 个答案:

答案 0 :(得分:5)

您根本不需要while循环。

您根本不想将read-a开关一起使用。相反,你想要:

read -r a b c <<< "$keyvariable"

在这种情况下,read将在空格上拆分变量keyvariable的(第一行)扩展,但仅限于第一个和第二个字段(这些将包含在变量{{ 1}}和a)其余部分将进入b。如果您的字符串中有反斜杠,则使用c开关;如果没有这个,反斜杠将被视为转义字符。

答案 1 :(得分:0)

gniourf_gniourf的答案是绝对正确的,但是如果你不知道你将有多少字段或需要根据其他一些标准选择你的“前缀”字段,然后使用数组和Substring Expansion

是这个用法的一个坏名称,但这就是所谓的。)可以让你这样做。

$ keyvariable="aa bb cc dd ee ff"
$ read -a line <<<"$keyvariable"
$ a=${line[0]}
$ b=${line[1]}
$ c=${line[@]:2}
$ echo "$a"
aa
$ echo "$b"
bb
$ echo "$c"
cc dd ee ff

另请注意,分配行上缺少$(echo ...)。你不需要它。

答案 2 :(得分:-2)

只做

a=( $keyvariable )

并且您的数组a包含您的值,因此您的示例将是

keyvariable="aa bb cc dd ee ff"
line=( $keyvariable ) # of course you can do it in the same line
a="${line[0]}"
b="${line[1]}"
n=$(( ${#line[@]} - 1))
unset line[$n]
echo "$a $b $c"