BASH技术问题:如何以计数器为变量名部分定义多个变量
在Bash中创建带数字后缀的变量的正确方法
你当前脚本的问题在于误用了set命令,它不能用来定义自定义变量,导致你想要的Variable1等变量根本没被创建,同时取值时也没有正确引用变量值,只是输出了变量名字符串。
问题分析
set Variable${j}=${Colors[i]}:set命令的作用是设置shell位置参数(如$1、$2)或修改shell选项,并非定义普通变量,这一行实际是把$1等位置参数设为类似Variable1=red的字符串,而非创建Variable1变量。printf " The value of [ Variable${j} ], is [ %s ]\n\n" Variable${j}:这里的Variable${j}是纯字符串,没有被解析为变量,所以输出的是变量名而非其值。
解决方案
方法1:使用declare命令+间接引用
这是最安全可靠的方式,适合大多数场景:
#!/bin/bash Colors=( red \ blue \ green \ yellow ) declare i=0 declare j=1 while (( j < ${#Colors[*]} + 1 )) do # 动态创建带数字后缀的变量并赋值 declare "Variable${j}=${Colors[i]}" echo " Created variable named [ Variable${j} ] with value [ ${Colors[i]} ]" # 构造变量名字符串,通过间接引用获取值 varname="Variable${j}" printf " The value of [ Variable${j} ], is [ %s ]\n\n" "${!varname}" (( j++ )) (( i++ )) done
关键说明:
declare "Variable${j}=${Colors[i]}":引号确保变量名和值被正确解析,当j=1时,等效于执行declare Variable1=red,成功创建变量并赋值。${!varname}:Bash的间接引用语法,varname存储的是目标变量的名称,此语法会取出该变量的实际值。
方法2:使用eval(需注意安全)
如果需要兼容较老的Bash版本,可以用eval,但要注意当变量值包含特殊字符(如空格、引号)时可能引发问题:
#!/bin/bash Colors=( red \ blue \ green \ yellow ) declare i=0 declare j=1 while (( j < ${#Colors[*]} + 1 )) do varname="Variable${j}" # 用eval动态赋值 eval "$varname='${Colors[i]}'" echo " Created variable named [ $varname ] with value [ ${Colors[i]} ]" # 用eval取值 eval "value=\$$varname" printf " The value of [ $varname ], is [ %s ]\n\n" "$value" (( j++ )) (( i++ )) done
方法3:优先使用数组(更简洁的替代方案)
如果不是必须创建Variable1这类命名变量,直接利用Bash数组的索引特性会更简洁:
#!/bin/bash Colors=( red blue green yellow ) # 数组索引从0开始,若要从1对应,直接偏移索引即可 for (( j=1; j<=${#Colors[@]}; j++ )) do echo " Index [ $j ] corresponds to value [ ${Colors[j-1]} ]" done
修改后脚本的输出
执行修改后的脚本(以方法1为例),会得到正确的输出:
Created variable named [ Variable1 ] with value [ red ] The value of [ Variable1 ], is [ red ] Created variable named [ Variable2 ] with value [ blue ] The value of [ Variable2 ], is [ blue ] Created variable named [ Variable3 ] with value [ green ] The value of [ Variable3 ], is [ green ] Created variable named [ Variable4 ] with value [ yellow ] The value of [ Variable4 ], is [ yellow ]
内容的提问来源于stack exchange,提问作者Bruce Ferjulian
相关产品推荐
相关产品推荐

