复制bash数组的问题,只有第一个元素存在

时间:2014-05-20 12:56:53

标签: arrays bash

我想声明一个数组,在存储旧值时暂时改变它的值,执行一些计算,然后恢复原始数组值。在这个过程中,我的原始数组声明,重新分配数组,甚至临时数组副本似乎都在工作。但是,我遇到了最终将阵列恢复到原始值的问题。

以下脚本演示了此问题。 MY_ARR是主数组,SAVE_MY_ARR是我正在制作的副本,而我在恢复它之前暂时修改了数组。根据脚本注释,所有内容都按预期打印出来,但恢复其值后原始数组除外。我在这里做错了什么?

剧本:

IFS=$'\n'

MY_ARR=(one two three)
# GOOD: prints "one,two,three,"
for i in ${MY_ARR[@]}; do
    echo -n "$i,"
done
echo ""

SAVE_MY_ARR=("${MY_ARR[@]}")
MY_ARR=(foo)
# GOOD: prints "foo,"
for i in ${MY_ARR[@]}; do
    echo -n "$i,"
done
echo ""

# GOOD: prints "one;two;three"
for i in ${SAVE_MY_ARR[@]}; do
    echo -n "$i;"
done
echo ""

# BAD: prints "one," and not "one,two,three,"
MY_ARR=("${SAVE_MY_ARR}")
for i in ${MY_ARR[@]}; do
    echo -n "$i,"
done
echo ""

输出:

one,two,three,
foo,
one;two;three;
one,

2 个答案:

答案 0 :(得分:1)

我认为这是一个错误的错误,在这里取代:

# BAD: prints "one," and not "one,two,three,"
MY_ARR=("${SAVE_MY_ARR}")

通过

# BAD: prints "one," and not "one,two,three,"
MY_ARR=("${SAVE_MY_ARR[@]}")

将[@]添加到SAVE_MY_ARR。

答案 1 :(得分:0)

bash数组不是第一类对象。在您的情况下,您发现$foo未扩展到数组foo的所有元素;它与${foo[0]}相同,只扩展为数组的第一个元素。复制数组的唯一方法是创建一个新数组,通过将第一个数组扩展为其元素序列,将其初始化为第一个数组的值。