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
위의 마지막 항목을 제외하고 해시에 최소한 하나의 요소가 포함되어 있다고 가정합니다( 아무 인수 도 null 키가 있는 요소가 있는 것처럼 printf '%s\0'
출력되지 않으므로 ).\0
어쨌든 따옴표 없이 작성하는 것은 거의 의미가 없습니다 ${!current_file[@]}
. 왜냐하면 해당 키 목록에서 분할+글로브 연산자를 호출하기 때문입니다.
답변2
연관 배열은 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