如何使用变量的值作为标识符以便 declare/modify BASH 中的数组?

How to use a variable's value as identifier in order to declare/modify an array in BASH?

我会尽力解释:

我正在编写一个 bash 脚本并且我在一个 for 循环中。对于 all 循环,我得到了一个变量 VAR_ID,它用于存储另一个变量的标识符,该变量将在所有工作完成后导出。对于 每个单个 循环,我得到一个变量 VALVAL 的值应分配给 VAR_ID 的值。最后,VAR_ID的值必须是数组才能存储所有值。

呸...好吧,这对我来说有点难以解释,但我认为这个简单的脚本应该阐明我正在尝试做的事情(当然,它已经从实际目的中缩小了范围):

#!/bin/bash

COUNT=0
VAR_ID="my_array"
declare -a "$VAR_ID"

while (( $COUNT <= 2 ))
do
    VAL=$RANDOM
    $VAR_ID+=( "$VAL" )    # this doesn't work
    (( COUNT++ ))
done

export $VAR_ID

这应该会产生一个变量 my_array 和其中的三个随机值。我尝试像在 declare $VAR_ID=$VAL 中那样使用 declare,但是如果我使用 += 而不是 =,这就不再起作用了。 COUNT 可以在可能的解决方案中用作位置编号,如果它有帮助的话,因为我在我的原始脚本中也有它。

提前感谢您的帮助

编辑:我知道 eval 有可能,但我尽量避免使用它,直到没有其他办法。

我不确定你到底想做什么,但你可以使用关联数组并将其导出。您可以使用 bash.

中的变量访问关联数组的元素
#!/usr/bin/env bash
declare -Ax arr # declare and export an associative array named 'arr'
declare -x var_id='array_position' # declare and export a variable named 'var_id'

for((i=0; i<=2; i++)); do
    val=${RANDOM}
    arr["${var_id}"]="${val}" # assign to the associative array with the var_id variable being the key, and val being the value
done

然后您可以使用变量、字符串或循环访问关联数组。

# Using an exact key name
echo "${arr[array_position]}"
# Using a variable which points to the key name
echo "${arr[${var_id}]}"
# Using a for loop
for key in "${!arr[@]}"; do
    value="${arr[${key}]}"
    echo "${key} ${value}"
done

来自bash manpage

When assigning to an associative array, the words in a compound assignment may be either assignment statements, for which the subscript is required, or a list of words that is interpreted as a sequence of alternating keys and values: name=(key1 value1 key2 value2 … ). These are treated identically to name=( [key1]=value1 [key2]=value2 … ). The first word in the list determines how the remaining words are interpreted; all assignments in a list must be of the same type. When using key/value pairs, the keys may not be missing or empty; a final missing value is treated like the empty string.

This syntax is also accepted by the declare builtin. Individual array elements may be assigned to using the name[subscript]=value syntax introduced above.

对于遇到相同问题的任何人,这是我自己的问题的答案:

#!/bin/bash

COUNT=0
VAR_ID="my_array"
declare PSEUDOARRAY    # is actually just a list of strings separated by spaces

while (( $COUNT <= 2 ))
do
    VAL=$RANDOM
    PSEUDOARRAY+="$VAL "
    (( COUNT++ ))
done

declare -agx $VAR_ID='( $PSEUDOARRAY )'    # "cast" PSEUDOARRAY on an actual array

这解决了我的问题。请注意,如果您不在最后执行“cast”部分,而只是直接使用 VAR_ID,则生成的 my_array 不会提供 ${my_array[0]} 之类的内容,仅提供第一项或 ${#my_array[@]} 计算项目数。

另请注意:此方法有局限性,因为它不区分可能存储在 VAL.

中的分隔符空间和“值空间”