Episode #125 of the Stack Overflow podcast is here. We talk Tilde Club and mechanical keyboards. Listen now
1 of 3

You can add another array to keep track the order of declaration:

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