On Fri, Jan 25, 2019, 9:51 PM Robert White <rwh...@pobox.com wrote: > On 1/22/19 10:23 PM, Chet Ramey wrote: > > On 1/22/19 3:32 PM, Robert White wrote: > >> Howdy, > >> > >> The following cannot work because, for some reason, the array subscript > >> parser insists on doing math on array indices even when the array is > >> associative instead of numeric > >> > >> typeset -A UUID_TABLE > >> ... > >> UUID_TABLE+=( [${SOME_UUID}]=${SOME_VALUE} ) > >> ... > >> some_command ${UUID_TABLE[${SOME_UUID}]} > >> > >> The parser and evaluator insist on doing math on ${SOME_UUID} no matter > how > >> its quoted or whatever. This seems extremely wrong. > > > > Do you have some sample UUID data to test this with? > > > I'm going to have to provisionally withdraw this report. The problem > only seems to happen in the custom /init script in my initramfs. Trying > to recreate it with a simpler script (and the same bash binary) on a > fully running system using the the UUIDs I collected with blkid doesn't > have a problem at all. So something "mysterious" is going on. > > The initscript is part of https://sourceforge.net/projects/underdog/ (if > you care) and is part of my attempt to build a concordance of UUID to > device to manager (e.g. lvm vs mdadm vs whatever) app. It works well > except when it doesn't. > > Thanks for the prompt response. If I isolate the test case or the issue > in general I'll be back. Even just to say never mind if I find a super > stupid mistake. 8-) > > --Rob White. >
I'm not going to try to do a full code review. It took me more time than I was willing to spend already to find a file that has an associative array referring to UUIDs in the first place and to put this message together. Here are a few comments about prototype/init: In the global scope UUID_TABLE is declared as an indexed array at one point then an associative array later. In the get_ (something) function an array element is set violating separation of get and set. In that same function, a max_index variable is set to the highest index of a numeric array then the array is iterated using a C-style for loop. Arrays in Bash are sparse and the correct way to iterate is to step over the elements or the indices. for element in "${array[@]}" for index in "${!array[@]}" But it seems you just want to add an element. array+=(element) There is a variable called AA. I didn't look to see if that means something but I shouldn't have to. A better name is needed. Forgive me if I misunderstood anything. It was just a cursory once over. Also, I didn't immediately notice what the UUID indexing problem initially reported is caused by. Except that I played with an indexed array with a UUID-like index. In that case the index *is* evaluated mathematically so this may be your problem. That makes sense based on the redefinition I mentioned above since the second declare will produce an error without affecting the array. >