Скопируйте ассоциативный массив bash с помощью оператора eval

Прежде чем мы перейдем к вопросу, я знаю, что уже есть ответы, ПОДОБНЫЕ на этот вопрос о переполнении стека. Однако этот уникален тем, что использует оператор eval с ассоциативными массивами. (Поверьте, я их все прочитал).

Хорошо, теперь к вопросу

У меня есть X массивов, определенных с помощью функции eval, подобной этой:

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

Этот код находится в функции: makeArrays

Теперь у меня есть вторая функция, которая должна перебирать эти разные массивы.

old1
old2
.
.
.
oldX

Я назову эту функцию: useArrays

Теперь у меня есть цикл for для этой функции useArrays.

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

У меня вопрос, как мне получить доступ к этому массиву ДЛЯ СРАВНЕНИЯ. IEif[ old1 -eq 0 ], то... fi

Есть ли способ КОПИРОВАТЬ эти связанные массивы в переменную, которую я могу использовать для сравнений, используя eval как можно меньше?

1 ответ

Современные версии 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[@]}"перебирать его ключи; также сопоставьтеnewArraynamevar для сравнения; и т.п.

Другие вопросы по тегам