Вы используете эту конструкцию:
b=("${!arrname}")
Это разворачивает значения массива, создавая новый массив b[]
с индексами массива значения по умолчанию удара, запускающимися от 0. Для надлежащей инициализации копии массива, необходимо было бы восстановить индексы (например, путем парсинга или eval
- луг вывод declare -p arrname
)
Вместо того, чтобы делать копию, лучший подход должен развернуть индексы, а не значения, и выполнить итерации по массиву с помощью тех. Этот подход будет работать с редкими, или ненулевыми основанными стандартными массивами (и даже bash4 ассоциативные массивы).
Выгода (не там всегда) то, что !
вытягивает двойную обязанность: его использование в косвенности ${!name}
не совместимо с его использованием для расширения индексов массива ${!arrname[@]}
, таким образом, мы должны использовать eval
.
Вот измененная версия, которая реализует это:
getIndex2() {
local arrname=$1 iidx idxs index ival val
printf -v iidx '"${!%s[@]}"' "$arrname"
eval "idxs=($iidx)"
for index in "${idxs[@]}"; do
printf -v ival '${%s[%s]}' "$arrname" "$index"
eval "val=$ival"
if [[ "${val}" = "$VALUE" ]]; then
echo "index is $index"; return
fi
done
}
Отметьте использование printf -v var ...
(колотите 3.1 +) пытаться сохранить eval
читаемый. Индексы расширены в массив, это не строго необходимо, плоский список сделал бы также.
См. также BashFAQ/006.
У меня такая же проблема с моим 660м. Прошлой ночью я попробовал установку шмель
, и это , кажется , чтобы облегчить проблему. Я использовал этот (очень грубый) учебник . Это позволит вам идти в правильное направление в любом случае.
Опять же, я не могу 100% подтвердить, что это работает, но, похоже, работает. После того, как после этого, и перезапускаясь, я был на моем ноутбуке в течение хороших 6 часов без проблем.