0

在我们进入这个问题之前,我知道在堆栈溢出时已经有类似的答案了。然而,这个是独一无二的,因为它使用带有关联数组的 eval 语句。(相信我,我都读过)。

好的,现在进入问题

我通过类似于此的 eval 函数定义了 X 个数组:

for (( i=1;i<=X;i++ ))
do
   eval "declare -gA old$i"
   eval "old$i[key]=value"
done

此代码在函数中:makeArrays

现在我有第二个函数必须遍历这些不同的数组

old1
old2
.
.
.
oldX

我会调用这个函数:useArrays

现在,我有一个用于这个 useArrays 函数的 for 循环。

for (( i=0;i<$#;i++ ))
do
  // ACCESS OLD1[KEY]
done

我的问题是,我如何访问这个数组进行比较。IE if[ old1 -eq 0 ] then ... fi

有没有办法可以将这些关联数组复制到一个变量中,以便尽可能少地使用 eval 进行比较?

4

1 回答 1

3

现代版本的 bash 支持namerefs(最初是 ksh 功能),因此您可以将常量名称指向您选择的任何变量;这eval对于您当前放置它的目的来说是不必要的。

key="the key you want to test"
for (( i=0;i<$#;i++ )); do
  declare -n "oldArray=old$i"  # map the name oldArray to old0/old1/old2/...
  printf 'The value of %q in old%q is: %q\n' "$key" "$i" "${oldArray[$key]}"
  unset -n "oldArray"          # remove that mapping
done

您当然可以参考"${!oldArray[@]}"迭代它的键;还映射一个newArray名称变量以进行比较;等等

于 2020-06-22T15:02:04.947 回答