удар: заставьте имя массива от параметра функционировать с сохранением индексов

  • Резервное копирование
  • Переформатировать
  • Восстановление
  • cryptsetup luksRemoveKey только удалил бы ключ шифрования, если бы у Вас был больше чем один. Шифрование все еще было бы там.

    Fedora Раздел Installation_Guide C.5.3 объясняет как luksRemoveKey работы.

    То, что "невозможно" удалить шифрование, в то время как хранение содержания является просто образованным предположением. Я основываю это на двух вещах:

    • Поскольку контейнер LUKS имеет файловую систему или LVM или независимо от того, что сверху его, просто удалив слой шифрования потребовал бы знания значения данных, хранивших сверху его, который просто не доступен. Кроме того, требование было бы то, что, перезаписывая часть объема LUKS с его дешифрованным дубликатом, не повредит остальную часть содержания LUKS, и я не уверен, может ли это быть сделано.
    • Реализация его решила бы проблему, которая является почти так далеко от цели LUKS, как можно добраться, и я нахожу его очень вряд ли, что кто-то не торопился бы, чтобы сделать это вместо чего-то более "значимого".
3
07.10.2013, 14:31
2 ответа

Вы используете эту конструкцию:

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.

1
27.01.2020, 21:28

Массивы в Bash основаны на нуле. Они просто. Тем не менее, если Вы знаете, что массив всегда будет индексированным числами, запускающимися от 1, просто добавьте +1 к результату. Добавьте второй аргумент функции, которая скажет его, какое число начать с или добавить к результату, и добавляют разумное значение по умолчанию для случаев, где второй аргумент отсутствует. Или цикл по индексам как mr.spuratic предлагает.

1
27.01.2020, 21:28

Теги

Похожие вопросы