Печатать файлы в обратном порядке из ассоциативного массива в bash

for key in ${!current_file[@]} do echo $key done 

Я объявляю current_file, как показано ниже в bash:

 declare -A current_file 

введите ключ как файл и размер как значение в current_file. Выходные данные для печати цикла:

 file2 file1 

Я хочу напечатать как:

 file1 file2 

Как я могу напечатать вот так?

2 Solutions collect form web for “Печатать файлы в обратном порядке из ассоциативного массива в bash”

Чтобы распечатать список ключей, отсортированных в алфавитном порядке, и при выборе sort GNU, вы можете сделать следующее:

 printf '%s\0' "${!hash[@]}" | sort -z | tr '\0' '\n' 

Или перебирать отсортированный список ключей:

 while IFS= read -rd '' -u3 key; do something with "${hash[$key]}" done 3< <(printf '%s\0' "${!hash[@]}" | sort -z) 

Если вы можете гарантировать, что ключи не будут содержать символы новой строки, вы можете упростить его:

 printf '%s\n' "${!hash[@]}" | sort 

С zsh это будет:

 printf "%s\n" "${(ko@)hash}" 

( k чтобы получить ключи, o заказать этот список, @ внутри двойной кавычки, чтобы сохранить пустой ключ, если он есть (обратите внимание, что bash настоящее время имеет ограничение в том, что он не может иметь хэш-элемент с пустым ключом)).

И зацикливать на них:

 for key in "${(ko@)hash}"; do something with "$hash[$key]" done 

Обратите внимание, что кроме последнего, указанного выше, мы предполагаем, что хэш содержит хотя бы один элемент (поскольку printf '%s\0' без аргумента все равно выводит \0 как если бы существовал элемент с пустым ключом).

В любом случае запись ${!current_file[@]} unquoted имеет мало смысла, так как это вызывает оператор split + glob в этом списке ключей.

Ассоциативный массив в bash подобен хешам / словарям на типичных языках и, как и они, неупорядочен (упорядочен по внутреннему хеш-значению на самом деле). Поэтому вы не можете ожидать, что результат будет (как правило) отсортирован, итерации по (ассоциативным) массивам.

Вам нужно отсортировать его самостоятельно, например, отправив STDOUT в STDIN sort :

 for key in ${!current_file[@]}; do echo $key done | sort 

или что-то подобное.


Если вы хотите сохранить заказ, чтобы вы могли выполнять любую операцию на основе ассоциативных массивов / значений, вы можете сохранить другой индексированный массив в качестве ссылки для вставки. Следующее должно дать вам базовую идею:

 ## Associative array `foo` $ declare -A foo=([spam]=egg [baz]=cool) ## Reference indexed array `bar` containing the keys of `foo` sequentially indexed $ bar=(spam baz) ## Retrieving in forward order $ for i in "${bar[@]}"; do echo "$i :: ${foo[$i]}"; done spam :: egg baz :: cool ## Retrieving in reverse order $ for ((i=${#bar[@]}-1; i>=0; i--)); do idx="${bar[$i]}"; echo "$idx :: ${foo[$idx]}"; done baz :: cool spam :: egg 
  • Дайте полные разрешения владельцу и только одному другому пользователю
  • Как получить права доступа к файлу в определенном формате?
  • Поиск изменений в общем объекте через bash
  • Правильное понимание прав для cp
  • Какие инструменты я могу использовать для индексирования PDF?
  • Печатать структуру файла в Unix
  • Как сохранить один файл в каталоге?
  • Как создать структурированный список всех файлов и каталогов в определенном каталоге (рекурсивно)?
  • Есть ли MD5 (или аналогичный) в папке? Как проверить, совпадают ли две папки?
  • Получите список файлов Linux, рекурсивный и прямой вывод в файл
  • Изменение времени файла с помощью сенсорного
  • Interesting Posts

    открыть (1) в rifle.conf для рейнджера на OS X

    nftables ip set несколько таблиц

    Конфигурация myhostname с многопоточным именем postfix

    Замените все вхождения двух пробелов после окончания предложения одним пространством

    Есть ли способ узнать, когда / когда был вызван исполняемый файл?

    Создание пользователя FTP, который не получает 403 на созданных папках / файлах – Ubuntu

    Поиск в обратном и прямом направлениях осуществляется с помощью vi-режима в zsh

    Настроить экран GNU для повторного подключения к текущей ширине терминала при повторном подключении?

    Как я могу исследовать, что другие пользователи в настоящее время вошли в систему?

    Git – удалить файл из двух ветвей

    Как завершить завершенную установку Debian?

    Как исключить строки, которые не содержат строку из вывода скрипта awk?

    Как обновить серверы Linux?

    Почему нельзя загружать плагин для Debian?

    Заменить или изменить содержимое файла одним выстрелом

    Linux и Unix - лучшая ОС в мире.