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