我有以下代码:
#!/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
为什么在调用函数时索引会发生变化?
答案 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