1

I wish to access an associative array using a variable. The example in the accepted answer to this post is exactly what I want:

$ declare -A FIRST=( [hello]=world [foo]=bar )
$ alias=FIRST
$ echo "${!alias[foo]}"

however this does not work for me when using bash 4.3.48 or bash 3.2.57. It does however work if I don't declare ("declare -A") the array i.e. this works:

$ FIRST[hello]=world 
$ FIRST[foo]=bar
$ alias=FIRST
$ echo "${!alias[foo]}"

Is there any problem with not declaring the array?

2
  • There's a huge problem: it creates a numerically-indexed array, rather than an associative (string-indexed) array. Since hello and foo aren't defined, FIRST[hello] and FIRST[foo] are both equivalent to FIRST[0]. Commented Mar 18, 2019 at 7:36
  • So as Gordon said, the second will not work: echo "${!alias[foo]}" "${!alias[hello]}" will output bar bar. The world is lost. Commented Mar 18, 2019 at 7:41

1 Answer 1

1

It works just as expected, you just missed out defining one more level of indirection to access the value,

declare -A first=()
first[hello]=world 
first[foo]=bar
alias=first
echo "${!alias[foo]}"     

The above result would obviously be empty as the other answer points out as there is no reference created yet to the array key. Now define an item to introduce a second level of indirect reference to point out to the actual key value.

item=${alias}[foo]
echo "${!item}"
foo

Now point item to the next key hello

item=${alias}[hello]
echo "${!item}"
world

Or a more detailed example would be, to run a loop over the keys of the associative array

# Loop over the keys of the array, 'item' would contain 'hello', 'foo'
for item in "${!first[@]}"; do    
    # Create a second-level indirect reference to point to the key value
    # "$item" contains the key name 
    iref=${alias}["$item"]
    # Access the value from the reference created
    echo "${!iref}"
done
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.