58

I want to declare a variable, the name of which comes from the value of another variable, and I wrote the following piece of code:

a="bbb"
$a="ccc"

but it didn't work. What's the right way to get this job done?

Benjamin W.
  • 46,058
  • 19
  • 106
  • 116
Haiyuan Zhang
  • 40,802
  • 41
  • 107
  • 134
  • If you are on Bash 5+ the better solution is nearly always an associative array. The duplicate has several demonstrations of this. – tripleee Jan 04 '23 at 07:18

6 Answers6

70

eval is used for this, but if you do it naively, there are going to be nasty escaping issues. This sort of thing is generally safe:

name_of_variable=abc

eval $name_of_variable="simpleword"   # abc set to simpleword

This breaks:

eval $name_of_variable="word splitting occurs"

The fix:

eval $name_of_variable="\"word splitting occurs\""  # not anymore

The ultimate fix: put the text you want to assign into a variable. Let's call it safevariable. Then you can do this:

eval $name_of_variable=\$safevariable  # note escaped dollar sign

Escaping the dollar sign solves all escape issues. The dollar sign survives verbatim into the eval function, which will effectively perform this:

eval 'abc=$safevariable' # dollar sign now comes to life inside eval!

And of course this assignment is immune to everything. safevariable can contain *, spaces, $, etc. (The caveat being that we're assuming name_of_variable contains nothing but a valid variable name, and one we are free to use: not something special.)

Kaz
  • 55,781
  • 9
  • 100
  • 149
62

You can use declare and !, like this:

John="nice guy"
programmer=John
echo ${!programmer} # echos nice guy

Second example:

programmer=Ines
declare $programmer="nice gal"
echo $Ines # echos nice gal
Flimm
  • 136,138
  • 45
  • 251
  • 267
19

This might work for you:

foo=bar
declare $foo=baz
echo $bar
baz

or this:

foo=bar
read $foo <<<"baz"
echo $bar
baz
potong
  • 55,640
  • 6
  • 51
  • 83
10

You could make use of eval for this.
Example:

$ a="bbb"
$ eval $a="ccc"
$ echo $bbb
ccc

Hope this helps!

another.anon.coward
  • 11,087
  • 1
  • 32
  • 38
6

If you want to get the value of the variable instead of setting it you can do this

var_name1="var_name2"
var_name2=value_you_want
eval temp_var=\$$var_name1
echo "$temp_var"

You can read about it here indirect references.

bat_ventzi
  • 326
  • 2
  • 4
-3

You can assign a value to a variable using simple assignment using a value from another variable like so:

#!/usr/bin/bash

#variable one
a="one"

echo "Variable a is $a"
#variable two with a's variable
b="$a"

echo "Variable b is $b"

#change a
a="two"
echo "Variable a is $a"
echo "Variable b is $b"

The output of that is this:

Variable a is one
Variable b is one
Variable a is two
Variable b is one

So just be sure to assign it like this b="$a" and you should be good.

Jossie B
  • 335
  • 1
  • 3
  • 7
  • The question is how to indirect upon computed variable names, now how to assign expressions fixed variables. – Kaz Mar 15 '12 at 07:07