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