Contents
1. 要求:动态创建变量名,并引用动态变量名
在shell脚本中动态生成一组变量名,并引用生成的变量名。示例如下:
var_$n=$n+2
,最终得到如下表达式
var_1=3
var_2=5
var_3=7
2. 实现:2种方式
下面分别使用指针变量(Pointer Variable)以及数组的形式实现动态创建变量的需求。
2.1. 指针变量的形式(Pointer Variable)
使用指针变量的形式,就是使用一个中间变量保存动态生成的变量名,这样一来,就将赋值操作从此前的等号左边搬到了等号右边。然后对指针变量进行赋值,以及引用指针变量获取变量值。
具体示例如下所示:
# 动态变量名
# 1. 利用declare结合${!variable}的方式定义动态变量并提取动态变量名
echo '================= declare ===================='
for n in `seq 5`
do
var_name=var_$n
declare $var_name='hello world'+$n
echo $var_name # 取变量名
echo ${!var_name} # 取变量值
done
echo '================= declare 1 ===================='
# 1的变体
for n in `seq 5`
do
declare var_$n='hello world'+$n
var_name=var_$n
echo $var_name # 取变量名
echo ${!var_name} # 取变量值
done
上述脚本的执行结果如下所示:
[root@c7u6s8:test]# bash test.sh
================= declare ====================
var_1
hello world+1
var_2
hello world+2
var_3
hello world+3
var_4
hello world+4
var_5
hello world+5
================= declare 1 ====================
var_1
hello world+1
var_2
hello world+2
var_3
hello world+3
var_4
hello world+4
var_5
hello world+5
注意: 在引用动态变量所存储的值的时候,需要注意不要省略大括号中的感叹号,否则就变成了打印动态变量名,而不是动态变量名所保存的值。
2.2. 数组的形式(Array)
在shell中的数组,支持关联数组和索引数组,两者的定义方式类似,实际使用上,在此处是可以通用的。具体如下所示:
echo '================= Associate Array ===================='
# 2. 关联数组(associate array)或者索引数组实现动态变量名
# declare -A dynamic_var_arr=() # 定义关联数组
declare -a dynamic_var_arr=() # 定义索引数组
for n in `seq 5`
do
dynamic_var_arr[$n]='hello world'_$n
echo '数组中的值' ${dynamic_var_arr[$n]}
echo '数组长度' ${#dynamic_var_arr[*]}
echo '获取数组中的索引下标' ${!dynamic_var_arr[@]}
echo '数组中所有的值' ${dynamic_var_arr[@]}
# 下面的方式获取数组中的内容
var=dynamic_var_arr[$n]
echo ${!var}
echo '-----'
done
上述输出的结果如下所示:
================= Associate Array ====================
数组中的值 hello world_1
数组长度 1
获取数组中的索引下标 1
数组中所有的值 hello world_1
hello world_1
-----
数组中的值 hello world_2
数组长度 2
获取数组中的索引下标 1 2
数组中所有的值 hello world_1 hello world_2
hello world_2
-----
数组中的值 hello world_3
数组长度 3
获取数组中的索引下标 1 2 3
数组中所有的值 hello world_1 hello world_2 hello world_3
hello world_3
-----
数组中的值 hello world_4
数组长度 4
获取数组中的索引下标 1 2 3 4
数组中所有的值 hello world_1 hello world_2 hello world_3 hello world_4
hello world_4
-----
数组中的值 hello world_5
数组长度 5
获取数组中的索引下标 1 2 3 4 5
数组中所有的值 hello world_1 hello world_2 hello world_3 hello world_4 hello world_5
hello world_5
-----