Bashの連想配列から逆順にファイルを印刷する

Bashの連想配列から逆順にファイルを印刷する
for key in ${!current_file[@]} 
    do
      echo $key      
     done

bashでcurrent_fileを次のように宣言します。

declare -A current_file

current_fileにキーをファイルに、サイズを値として挿入します。 forループによって印刷された出力:

file2
file1

次のように印刷したいと思います。

file1 
file2

どうすればこのように印刷できますか?

ベストアンサー1

GNU を想定してキーのアルファベット順のリストを印刷するには、sort次のようにします。

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

上記の最後の項目を除いて、ハッシュに少なくとも1つの要素が含まれているとします(引数がnullキーを持つ要素があるかのように出力されprintf '%s\0'ないため)。\0

とにかく引用符なしで書くことはほとんど意味がありません${!current_file[@]}。なぜなら、そのキーリストから分割+グローブ演算子を呼び出すからです。

おすすめ記事