在shell脚本中创建动态变量,并引用存储在动态变量中的值

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
-----

3. References

[1]. Dynamic variable names in Bash

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值