This question already has an answer here:

I have a variable (var) which return value as VAR1 ($var has the value VAR1). There is an input file which has VAR1 defined (VAR1=ABCDEF)

How can I use echo to get the value ABCDEF using $var??

I tried echo $(echo $var) and many other options, but I always get output as VAR1 or echo VAR1 but never ABCDEF. I used source in file with VAR1 declared, tried in command prompt etc.

marked as duplicate by Kusalananda, DopeGhoti, jimmij, user34720, muru Mar 28 at 1:21

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.


Assuming that you are using the bash shell:

$ source ./file
$ echo "$VAR1"
$ var=VAR1
$ echo "${!var}"

By using ${!var} you use variable indirection in bash. The value of the variable var is used to get the name of the variable to expand.

In bash you could also use a name reference variable:

$ source ./file
$ echo "$VAR1"
$ declare -n var="VAR1"
$ echo "$var"

Here, the var variable refers to the VAR1 variable, so $var will expand to whatever $VAR1 expands to.

Name references are originally a ksh feature, and in that shell they are declare with typeset -n.

Name references are extremely useful fo passing references to arrays in calls to shell functions.

In any sh shell:

$ . ./file
$ echo "$VAR1"
$ var=VAR1
$ eval "echo \"\$$var\""

The eval utility takes a string which it will re-evaluate. Here, we give it the string echo "$VAR1" (after expansion of $var).

The issue with eval is that it's easy to introduce errors or vulnerabilities with it, by carelessly creating its argument string.


Assuming you are using bash, you can accomplish this easily with an indirect reference:

$ foo=bar
$ bar=magicword
$ printf "%s\n" "${!foo}"

The syntax $var (or ${var}) yields the contents of the variable var.

The syntax ${!var} yields the contents of the variable named in var.

Not the answer you're looking for? Browse other questions tagged or ask your own question.