On Mon, Dec 22, 2025 at 20:21:57 +0100, Félix Hauri via Bug reports for the GNU 
Bourne Again SHell wrote:
>   $ declare -A aa=( empty '' inject '$(date)' "space key" "space value"  \
>         '$(uptime)' injected  lb \[ rb \] punc $' \t\n' )
>   $ printf -v tmpString '["%s"]="%s" ' "${aa[@]@k}"
>   $ declare -A "newarray=($tmpString)"
>   $ declare -p newarray
>   declare -A newarray=([inject]="Mon Dec 22 20:16:59 CET 2025" [lb]="[" 
> ["space ke
>   y"]="space value" [empty]="" [punc]=$' \t\n' [rb]="]" [" 20:16:59 up 1 
> days, 10:
>   18, 1 users,  load average: 0.18, 0.12, 0.23"]="injected" )

So you've discovered a way that *doesn't* work.  Congratulations.  Now
don't use that.

So far, the ways we've discovered that *do* seem to work are:

 1) printf -v string '[%q]=%q ' "${aa[@]@k}"; declare -A "new=($string)"

 2) string="${aa[*]@K}"; eval declare -A "new=($string)"

 3) list=("${aa[@]@k}"); eval declare -A "new=(${list[*]@Q})"

The first two serialize the associative array as a string (two different
strings).  The third one dumps the array to a list, then serializes that
list as a (transient) string.

There is no known way to reconstruct an associative array directly from
a list, without first converting that list to a string.

  • Re: Question a... Koichi Murase
    • Re: Quest... Greg Wooledge
      • Re: Q... Zachary Santer
        • R... Greg Wooledge
      • Re: Q... Koichi Murase
        • R... Koichi Murase
      • Re: Q... Félix Hauri via Bug reports for the GNU Bourne Again SHell
        • R... Greg Wooledge
          • ... Félix Hauri via Bug reports for the GNU Bourne Again SHell
            • ... Félix Hauri via Bug reports for the GNU Bourne Again SHell
            • ... Greg Wooledge

Reply via email to