bash函数返回更改的索引

时间:2018-01-19 12:00:14

标签: arrays bash

我有以下代码:

#!/bin/bash
function getSlots {
    declare -A slots
    for index in `seq 7 10`;
    do
        slots[$index]=$index
    done
    echo ${slots[@]}
}

slots=($(getSlots))

for i in ${!slots[@]};
do
    echo "$i ${slots[$i]}"
done

当我跑步时,我的输出是这样的:

0 10
1 7
2 8
3 9

为什么在调用函数时索引会发生变化?

2 个答案:

答案 0 :(得分:2)

arr=(...)重新索引数组。

使用您当前的方法,您无法保留索引,因为一旦您离开该函数(您只需echo值),任何有关它们的信息都会丢失。

您可以使用nameref(需要bash 4.3或更高版本)直接修改提供的数组,因为您只使用数字作为索引,所以常规数组就足够了:

#!/usr/bin/env bash

function get_slots {
    local index                    # makes index local
    local -n _arr=$1               # _arr points to the supplied array
    _arr=()                        # empties the array
    for index in {7..10}; do
        _arr[index]=$index         # assigns new values to the array
    done
}

get_slots slots

for i in "${!slots[@]}"; do
    echo "$i ${slots[$i]}"
done

答案 1 :(得分:1)

因为函数echo ${slots[@]}末尾的getSlots扩展为echo 10 7 8 9,并且该输出是您通过执行以下操作分配给数组slots的内容:

slots=($(getSlots))

另一个有趣的问题是echo ${slots[@]}扩展到echo 10 7 8 9而不是echo 7 8 9 10的原因。

这是因为slots内的getSlots被声明为关联数组,而不是数组,即:

declare -A slots

将以上行替换为:

declare -a slots

您将获得以下输出:

0 7
1 8
2 9
3 10