Debian Bash 关联数组自(内部)引用

Debian Bash 关联数组自(内部)引用

我正在尝试构建一个关联数组,其中数组内的键值对引用同一数组中的其他键值对,使用 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. 这能做到吗?
  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在每次尝试之前进行此操作。

相关内容