Para imprimir a lista de chaves ordenadas alfabeticamente e assumindo o GNU sort
, você poderia fazer:
printf '%swhile IFS= read -rd '' -u3 key; do
something with "${hash[$key]}"
done 3< <(printf '%sprintf '%s\n' "${!hash[@]}" | sort
' "${!hash[@]}" | sort -z)
' "${!hash[@]}" | sort -z | tr 'printf "%s\n" "${(ko@)hash}"
' '\n'
Ou para percorrer a lista de chaves classificadas:
for key in "${(ko@)hash}"; do
something with "$hash[$key]"
done
Se você puder garantir que as chaves não conterão caracteres de nova linha, você poderá simplificá-lo para:
printf '%swhile IFS= read -rd '' -u3 key; do
something with "${hash[$key]}"
done 3< <(printf '%sprintf '%s\n' "${!hash[@]}" | sort
' "${!hash[@]}" | sort -z)
' "${!hash[@]}" | sort -z | tr 'printf "%s\n" "${(ko@)hash}"
' '\n'
Com zsh
, isso seria:
for key in "${(ko@)hash}"; do
something with "$hash[$key]"
done
( k
para obter as chaves, o
para ordenar essa lista, @
dentro de aspas duplas para preservar a chave vazia se houver alguma (note que bash
tem atualmente uma limitação em que não pode ter um elemento hash com uma chave vazia)).
E para passar por cima deles:
%pre% Observe que, exceto para o último acima, assumimos que o hash contém pelo menos um elemento (como printf '%s
sem argumento ainda produziria %code% como se houvesse um elemento com uma chave vazia). / p>
'${!current_file[@]}
Em qualquer caso, escrever %code% sem aspas faz muito pouco sentido, já que invoca o operador divisão + glob nessa lista de chaves.