Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why indirect variable reference not work in bash dictionary

I know it( ! indirect variable reference ${!parameter}) will work in the general variable, but I need to use it in dictionary, and it doesn't work. Could somebody know the reason and how to achieve it?

I only konw the dictionary name and the key name, how to get the value in the dictionary?

#!/bin/bash
declare -A a_dict
a_dict=(
    ['aa']='valueA'
    ['ab']='valueB'
)

declare -A b_dict
b_dict=(
    ['ba']='valueA'
    ['bb']='valueB'
)

indirect_var(){
    name=$1
    key=$2
    echo ${!name[$key]}
}

indirect_var a_dict aa
like image 493
Victor Lee Avatar asked Sep 13 '25 06:09

Victor Lee


1 Answers

In comments pmf has already provided a working function using an indirect reference.

If running bash 4.3+ another option would be a nameref, eg:

get_val() {
    local -n _var="$1"          # -n == nameref
    echo "${_var[$2]}"
}

### or as a one-liner:

get_val() { local -n _var="$1"; echo "${_var[$2]}"; }

Taking for a test drive:

$ get_val a_dict aa
valueA

$ get_val b_dict bb
valueB

$ get_val b_dict xyz
                          # blank output

$ get_val c_dict xyz
                          # blank output
like image 186
markp-fuso Avatar answered Sep 16 '25 08:09

markp-fuso