On Sun, Mar 24, 2024 at 03:54:10PM -0500, Dennis Williamson wrote: > The @K transform outputs key value pairs for indexed arrays as well as > associative arrays (you used the @k transform which does word splitting and > loses the k-v sequence).
The @K (capital) transformation gives you quoted strings which need to be eval'ed. Very Bourne-shell-ish. The @k (lowercase) transformation gives you a list of alternating raw key/value strings, like what you'd expect from a Tcl command. hobbit:~$ unset -v hash kvlist hobbit:~$ declare -A hash=([key 1]='value 1' [key 2]='value 2') hobbit:~$ kvlist=( "${hash[@]@k}" ) hobbit:~$ declare -p kvlist declare -a kvlist=([0]="key 2" [1]="value 2" [2]="key 1" [3]="value 1") hobbit:~$ kvlist2=( "${hash[@]@K}" ) hobbit:~$ declare -p kvlist2 declare -a kvlist2=([0]="\"key 2\" \"value 2\" \"key 1\" \"value 1\" ") hobbit:~$ eval kvlist3=\("${hash[@]@K}"\) hobbit:~$ declare -p kvlist3 declare -a kvlist3=([0]="key 2" [1]="value 2" [2]="key 1" [3]="value 1") kvlist2 is an undesired result. Don't do that. kvlist and kvlist3 are both usable. > Thus the @K allows preserving indices in a sparse > indexed array. Both of them do that: hobbit:~$ sparse=(a b [42]=z) hobbit:~$ echo "${sparse[@]@K}" 0 "a" 1 "b" 42 "z" hobbit:~$ echo "${sparse[@]@k}" 0 a 1 b 42 z