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[@]}
。なぜなら、そのキーリストから分割+グローブ演算子を呼び出すからです。