Получить индекс of the array

Please install os-prober: pacman -S os-prober

Также, это bootmgfw.efi, а не bootmgfr.efi.

Файл bootmgfw.efi находится не на разделе Windows, а на системном разделе EFI. Используйте fdisk -l на каждом диске, чтобы найти раздел EFI. Затем извлеките файл bootmgfw.efi из Windows 10 ISO в $esp/EFI/Microsoft/boot, где $esp - это место, куда смонтирован раздел EFI. Затем запустите grub-mkconfig и все готово.

2
06.12.2019, 20:16
4 ответа

Поскольку кажется, что никто не предложил очевидного ответа, я сделаю это.

Почему бы просто не использовать числовой цикл for, который используется в основных языках программирования, таких как C и Java?

for ((i = 1; i <= $#arr; i++)); do
    echo "Index: $i, value: ${arr[i]}"
done

Или, даже короче (и медленнее, и, возможно, потребляет много памяти с большими массивами):

for i in {1..$#arr}; do
    echo "Index: $i, value: ${arr[i]}"
done
7
27.01.2020, 21:52

Начиная с zsh 5.0.6, вы можете расширять массив и генерировать индексы с помощью zip-архивирования:

for k v in "${(@)${=${(eQ):-'$( (( $#ary )) && echo {1..$#ary})'}}:^ary}"; do
  [[ -z $k ]] && continue
  echo "index: $k - value: $v"
done

Я бы не стал использовать это (из-за страха, что в будущем меня ударит сам), и это будет медленным для массивов с большое количество элементов. Увеличение счетчика было бы более эффективным, поскольку массивы в zsh не могут быть разреженными.

1
27.01.2020, 21:52

Вы можете использовать сопоставление литералов массива вместе с флагом, который возвращает текущий индекс, для этого:

arr=( foo bar baz )
for i in $arr; do
  echo "index ${arr[(ie)$i]}";
done

Флаг i возвращает индекс, а флаг e изменяет i , чтобы строка буквально соответствовала строке. Выражение гласит: для arr, который соответствует строке $ i, буквально возвращается индекс. Недостаток этого метода в том, что ему можно доверять только в том случае, если все элементы массива уникальны. В противном случае вам понадобится какой-нибудь счетчик.

2
27.01.2020, 21:52

«Практический» эквивалент (см. ограничение в комментариях ), но более простой способ сделать большую часть того, что сделал llua, используя вставку и подстановку процесса :

arr=( foo "bar 't' ttt" baz )
paste <(echo {1..$#arr}"\n") <(echo ${^arr}"\n") | head -n -1 | while read i v; do
  echo index $i, val : $v;
done

РЕДАКТИРОВАТЬ :Этот работает с предыдущими версиями zsh и обрабатывает пробелы и кавычки(ну, он не использует for, но оператор сказал «итерация», а не «цикл for»

arr=( foo "bar 't' ttt" baz )
paste <(echo {1..$#arr}"\n") <(echo ${^arr}"\n") | head -n -1 | while read i v; do
  echo index $i, val : $v;
done

-1
27.01.2020, 21:52

Теги

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