Por que a instrução printf neste loop produz o array fora de seqüência?

2

Quando executo o código a seguir, a saída da instrução printf parece mostrar o array fora de seqüência. Na declaração de declaração, o item Fonte é declarado antes do Destino e, na saída, é revertido.

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 ;

A saída parece

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

Alguém pode me dizer o que está acontecendo aqui? ou como posso conseguir a ordem correta de acordo com a declaração do array?

    
por dimmech 28.01.2015 / 04:36

1 resposta

8

O array associativo em bash (e em outros idiomas) não preserva a ordem dos elementos na declaração.

Você pode adicionar outro array associativo para acompanhar a ordem da declaração:

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
    
por 28.01.2015 / 04:53