将数组赋值给变量

时间:2012-09-06 15:59:11

标签: bash

关于在bash脚本中为变量分配数组的问题看起来相当复杂:

a=("a" "b" "c")
b=$a

echo ${a[0]} 
echo ${a[1]}

echo ${b[0]} 
echo ${b[1]} 

导致

a 
b 
a

而不是

a
b
a
b

为什么呢?我该如何解决?

2 个答案:

答案 0 :(得分:49)

如果你想重新分配一个包含数组的变量到另一个名字,你可以这样做:

a=('a' 'b' 'c')
b=( "${a[@]}" )

答案 1 :(得分:18)

为什么?

如果a是一个数组,$a会扩展为数组中的第一个元素。这就是为什么示例中b只有一个值的原因。在bash中,引用数组的变量不可分配,就像指针一样是C ++或Java。而是将变量扩展(如在参数扩展中)转换为字符串,并复制这些字符串并将其与所分配的变量相关联。

我该如何解决?

要复制包含带空格值的稀疏数组,必须通过索引一次复制一个元素 - 可以使用$ {!a [@]}获取。

declare -a b=()
for i in ${!a[@]}; do
    b[$i]="${a[$i]}"
done

来自bash手册页:

  

可以获得数组的键(索引)以及值。   $ {!name [@]}和$ {!name [*]}扩展为在数组变量名中指定的索引。   双引号中的处理类似于特殊的扩展   参数@和*在双引号内。

这是一个你可以自己测试的脚本:

#!/bin/bash

declare -a a=();
a[1]='red hat'
a[3]='fedora core'

declare -a b=();

# Copy method that works for sparse arrays with spaces in the values.
for i in ${!a[@]}; do
    b[$i]="${a[$i]}"
done

# does not work, but as LeVar Burton says ...
#b=("${a[@]}")

echo a indicies: ${!a[@]}
echo b indicies: ${!b[@]}

echo "values in b:"
for u in "${b[@]}"; do
    echo $u
done

打印:

a indicies: 1 3
b indicies: 1 3  # or 0 1 with line uncommented
values in b:
red hat
fedora core

如果在声明数组时使用declare -A(使用大写A而不是小写),这也适用于bash 4中的关联数组。