如何使用变量的值作为标识符以便 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
,它用于存储另一个变量的标识符,该变量将在所有工作完成后导出。对于 每个单个 循环,我得到一个变量 VAL
。 VAL
的值应分配给 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
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
.
中的分隔符空间和“值空间”
我会尽力解释:
我正在编写一个 bash 脚本并且我在一个 for 循环中。对于 all 循环,我得到了一个变量 VAR_ID
,它用于存储另一个变量的标识符,该变量将在所有工作完成后导出。对于 每个单个 循环,我得到一个变量 VAL
。 VAL
的值应分配给 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
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
.