变量间接引用,又叫变量嵌套;

先看一个二维嵌套的例子,二维即指有两个变量赋值

a=b;b=c

给出a,如何输出c?
正解:
lltest@c918f2c1n03:/sh> a=b; b=c
lltest@c918f2c1n03:/sh> eval echo $$a
c
变量嵌套在这里实际是模拟了c中指针的概念:a是指针,b是variable,而c是value。

推广:

a=b;b=c;c=d
这里有三个变量a,b,c,c中存放了最终值d
给出a,如何输出d?
实质是一个三维表顺序依次查找,这样的好处是:不管第二维和第一维变量如何动态变化,通过第三维,我们有了一个静态入口a,可以访问到最后的value。

第三维 第二维 第-维,即value
a–>b b–>c c–>d
a–>ab ab–>mf mf–>gggg

 

正解:
lltest@c918f2c1n03:/sh> a=b; b=c; c=d
lltest@c918f2c1n03:/sh> tmp=a;eval tmp=$$tmp;eval tmp=$$tmp;eval tmp=$$tmp
lltest@c918f2c1n03:/sh> echo $tmp
d

BASH中等价表达:

lltest@c918f2c1n05:~> a=b; b=c; c=d
lltest@c918f2c1n05:~> tmp=a; tmp=${!tmp}; tmp=${!tmp}; tmp=${!tmp};
lltest@c918f2c1n05:~> echo $tmp
d 问题:
如果d不是个value,而是数组,又如何引用?
解答:
{6120 z27c2s1}lltest> echo ${a[@]}
1 2 3
{6120 z27c2s1}lltest> b=a
{6120 z27c2s1}lltest> tmp=b
{6120 z27c2s1}lltest> eval tmp=$$tmp
{6120 z27c2s1}lltest> echo $tmp
a
{6120 z27c2s1}lltest> eval tmp_array=${$tmp[@]}
{6120 z27c2s1}lltest> echo $tmp_array          
1 2 3
{6120 z27c2s1}lltest> eval tmp_1=${$tmp[1]}
{6120 z27c2s1}lltest> echo $tmp_1          
2

版权所有,引用请注明出处

Advertisements