ru Русский

Reticularium

NETWORKS PLACE

There is the command eval available, that does the trick:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

a=10
b='$a'

echo $b               # $a
eval $b               # bash: 10: command not found
eval 'echo $b'        # $a
eval echo $b          # 10
eval "echo $b"        # 10
echo `eval echo $b`   # 10

Sometimes you can’t use single-quotes. In this case:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

a=10
b=a

echo $b                 # a
echo $$b                # 29785b
echo \$$b               # $a
eval echo \$$b          # 10

# note that:

echo `eval echo $b`     # a
echo `eval echo \$$b`   # 29785b

# but:

echo $(eval echo \$$b)  # 10

# or:

echo `eval echo \\$\$b`  #10

Let’s go a bit further:

1
2
3
4
5
6
7
#!/bin/bash

a=10
b='$a'
c='$b'

eval echo $(eval echo `echo $c`)        # 10

Without single-quotes:

1
2
3
4
5
6
7
#!/bin/bash

a=10
b=a
c=b

eval echo \$$(eval echo \$$c)      # 10

Perhaps to be continued…

Comment it: