¿Por qué la instrucción printf en este bucle genera la matriz fuera de secuencia?

¿Por qué la instrucción printf en este bucle genera la matriz fuera de secuencia?

Cuando ejecuto el siguiente código, el resultado de la declaración printf parece mostrar una matriz fuera de secuencia. En la declaración de declaración, el elemento Fuente se declara antes del Destino y en la salida se invierte.

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 ;

La salida parece

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

¿Alguien puede decirme qué está pasando aquí? ¿O cómo puedo lograr el orden adecuado según la declaración de matriz?

Respuesta1

La matriz asociativa en bash(y en otros idiomas) no conserva el orden de los elementos en la declaración.

Puede agregar otra matriz asociativa para realizar un seguimiento del orden de declaración:

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

información relacionada