Shell脚本中使用for循环创建动态变量的取值问题
解决Shell中动态变量的读取问题
问题原因
- 执行
echo $(name$i)时,Shell会把name$i(比如name0)当作命令去执行,而非读取变量,因此报错name0: command not found。 - 执行
echo "$name$i"时,Shell会优先解析$name(你未定义这个变量,值为空),再拼接$i的数值,最终输出空字符串加数字,而非目标变量name$i的值。
解决方案
方法1:使用Bash间接引用(推荐)
通过构造变量名字符串,再用${!变量名}的语法间接读取变量值,安全性更高:
function student() { for (( i=0; i < 5; i++ )); do # 构造变量名字符串,比如i=0时var值为name0 var="name$i" # 间接引用变量,等价于echo $name0 echo "${!var}" done }
方法2:使用eval命令
eval会让Shell重新解析命令,将动态构造的变量名解析为真实变量:
function student() { for (( i=0; i < 5; i++ )); do # 转义$name的$,避免Shell提前解析$name为空 eval "echo \$name$i" done }
补充说明
你的输入函数是正确的,read name$i确实会创建name0到name4这些独立变量,变量赋值没有问题。
内容的提问来源于stack exchange,提问作者Muhammad Arslan
相关产品推荐
相关产品推荐

