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