Search code examples
bashvariablesdynamicsyntax

Dynamic variable names in Bash


I am confused about a bash script.

I have the following code:

function grep_search() {
    magic_way_to_define_magic_variable_$1=`ls | tail -1`
    echo $magic_variable_$1
}

I want to be able to create a variable name containing the first argument of the command and bearing the value of e.g. the last line of ls.

So to illustrate what I want:

$ ls | tail -1
stack-overflow.txt

$ grep_search() open_box
stack-overflow.txt

So, how should I define/declare $magic_way_to_define_magic_variable_$1 and how should I call it within the script?

I have tried eval, ${...}, \$${...}, but I am still confused.


Solution

  • Use an associative array, with command names as keys.

    # Requires bash 4, though
    declare -A magic_variable=()
    
    function grep_search() {
        magic_variable[$1]=$( ls | tail -1 )
        echo ${magic_variable[$1]}
    }
    

    If you can't use associative arrays (e.g., you must support bash 3), you can use declare to create dynamic variable names:

    declare "magic_variable_$1=$(ls | tail -1)"
    

    and use indirect parameter expansion to access the value.

    var="magic_variable_$1"
    echo "${!var}"
    

    See BashFAQ: Indirection - Evaluating indirect/reference variables.