使用变量作为数组名称的一部分?

使用变量作为数组名称的一部分?

例如,我本质上有一个 for 循环,其中我正在迭代的变量i将采用字母表中的每个字母。我想使用 的每个值i创建一个名为"$i"array(例如aarraybarraycarraydarray等)的数组,甚至只是调用"$i"(因此数组可以被称为abcd等)。

我可以使用什么样的语法来实现这一点?

我努力了:

for i in ${alphabet[@]}; do
    "$i"array[0]=0
done

一旦我有了数组组,我可以通过执行以下操作来迭代它们吗

for i in ${alphabet[@]}; do
    "$i"array[0]=1
done

答案1

我可以提供其他方式(通过关联数组)来完成您的任务吗?它似乎更聪明和更容易接受:

declare -A array
for i in ${alphabet[@]}; do
  array[$i]=0
  # or array[${i}0]=0 if you need 
done

for i in ${!array[@]}所以你可以通过或 同样的方式迭代它for i in ${alphabet[@]}

答案2

您可以使用eval内置函数来计算变量名称。一个例子可以说明这一点:

i="a"
eval ${i}lphabet="abcde"
echo $alphabet

然而,从中检索值${i}lphabet需要另一个技巧。你必须使用价值变量作为变量名(本质上是一个指针)。语法是:

#declare a variable that names the other variable:
pointer=${i}lphabet
#dereference the name with the ! syntax:
echo ${!pointer}

适用于您的案例:

for i in ${alphabet[@]}; do
    pointer="$i"array
    eval ${pointer}[0]=0
done

然而,这是一个糟糕的设计......您应该找到一种更传统的方法来处理这个问题。

答案3

您必须使用eval变量的内容作为变量名:

for i in ${alphabet[@]}; do
    eval "$i[0]=1"
done

eval获取其参数并在 shell 的上下文中对其求值,即不作为单独的 shell,尝试执行此操作eval将导致单独的 shell 启动,因此变量集在第一个 shell 中将不可用。

相关内容