例如,我本质上有一个 for 循环,其中我正在迭代的变量i
将采用字母表中的每个字母。我想使用 的每个值i
创建一个名为"$i"array
(例如aarray
、barray
、carray
、darray
等)的数组,甚至只是调用"$i"
(因此数组可以被称为a
、b
、c
、d
等)。
我可以使用什么样的语法来实现这一点?
我努力了:
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 中将不可用。