이 루프에서 printf 문의 배열 출력이 순서에 맞지 않는 이유는 무엇입니까?

이 루프에서 printf 문의 배열 출력이 순서에 맞지 않는 이유는 무엇입니까?

다음 코드를 실행하면 printf 문의 출력에 배열이 정렬되지 않은 것으로 표시됩니다. 선언문에서는 소스 항목이 대상 항목보다 먼저 선언되고, 출력에서는 그 반대가 됩니다.

YELLOW=$'\e[93m'
declare -A OP=( [Description]="remote to destination" [Source]="/var/www" [Destination]="/foo/bar" [Log]="my.log" [Email]="me@here" );

NO_COLS=`tput cols`
COLS_PER_COL=$(($NO_COLS/3))
PRINT_FORMAT="%"$COLS_PER_COL"s%""s\n"

for i in "${!OP[@]}"; do
    printf $PRINT_FORMAT "$i :" " $YELLOW${OP[$i]}$ENDCOL"
done ;

출력은 다음과 같습니다.

         Description : remote to destination
         Destination : /foo/bar
              Source : /var/www
                 Log : my.log
               Email : me@here

여기서 무슨 일이 일어나고 있는지 말해 줄 수 있는 사람 있나요? 아니면 배열 선언을 기반으로 올바른 순서를 얻으려면 어떻게 해야 합니까?

답변1

(및 다른 언어)의 연관 배열은 bash선언의 요소 순서를 유지하지 않습니다.

선언 순서를 추적하기 위해 다른 연관 배열을 추가할 수 있습니다.

YELLOW=$'\e[93m'
declare -A OP=( [Description]="remote to destination"
                [Source]="/var/www"
                [Destination]="/foo/bar"
                [Log]="my.log"
                [Email]="me@here" )

declare -A IP=( [1]="Description"
                [2]="Source"
                [3]="Destination"
                [4]="Log"
                [5]="Email" );

NO_COLS="$(tput cols)"
COLS_PER_COL="$((NO_COLS/3))"
PRINT_FORMAT="%${COLS_PER_COL}s%s\n"

for i in "${!IP[@]}"; do
  k=${IP[$i]}
  printf "$PRINT_FORMAT" "$k :" " $YELLOW${OP[$k]}$ENDCOL"
done

관련 정보