我正在尝试构建一个关联数组,其中数组内的键值对引用同一数组中的其他键值对,使用 Debian Gnu-Linux 12.4、22.12.3 和 Bash 5.2.15。
例子,
declare -A test=(
[0]=0
[1]=1
[2]=2
[3]=$((test[1]+test[2]))
[4]="${test[1]} ${test[2]}"
)
当我在 Konsole 中执行以下 echo 语句时,
echo "${test[1]}"
echo "${test[2]}"
echo "${test[3]}"
echo "${test[4]}"
我有时会得到这个结果,
1
2
0
有时我会得到我想要的东西
1
2
3
1 2
由于这种不一致(可能完全是由我造成的),我有几个问题。
- 这能做到吗?
- 如果是,那么有没有正确的方法可以做到这一点?
此外,我找不到一种一致的方法来复制这两种不同的结果,无论如何都会发生。
答案1
不是你想的那样,因为变量引用不存储在数组中——相反,它们会立即作为“字符串文字”表达式的一部分进行评估——因此在评估引用时,的任务test
尚未完成。(与许多其他编程语言相同!)
(尽管语法相似,但只有test=…
或test[3]=…
是实际的变量赋值,而( [0]=… )
不是 - Bash 的数组键/值语法仅仅模仿了真正的test[3]=…
赋值语法,但在其他语言中,完全相同的概念通常看起来与test = { "0": 1234 }
或 类似。)
您需要多次作业才能正确完成此操作:
declare -A test=(
[0]=0
[1]=1
[2]=2
)
test[3]=$(( test[1] + test[2] ))
test[4]="${test[1]} ${test[2]}"
test+=(
[5]="${test[3]} and ${test[4]}"
[6]="${test[4]} but not yet ${test[5]}"
)
上面例子中的四个操作每一个都是一个赋值;首先处理所有变量引用和其他扩展,然后更新$
的值。test
此外,我找不到一种一致的方法来复制这两种不同的结果,无论如何都会发生。
如果您从示例中的扩展中获得结果,则它使用来自以前的赋值。declare -p test
在赋值之前(和之后)放置一个,以查看存储了哪些值。
为了确保实验的一致性,请unset test
在每次尝试之前进行此操作。