求助:如何在ksh中通过循环递增变量名并输出变量值
在ksh中通过变量名递增循环输出值的解决方法
方法1:使用eval实现间接变量引用
eval可以动态解析变量名,适配所有版本的ksh:
#!/bin/ksh var1="Hi" var2="world" i=1 while true; do # 检查当前编号的变量是否存在 if eval "[[ -z \${var$i} ]]"; then break fi # 动态输出对应变量的值 eval "echo \${var$i}" ((i++)) done
方法2:利用ksh93的间接引用特性
如果你的环境是ksh93,用${!变量名}的语法更简洁,无需依赖eval:
#!/bin/ksh var1="Hi" var2="world" i=1 while true; do # 拼接出当前要访问的变量名 varname="var$i" # 检查变量是否存在 if [[ -z ${!varname} ]]; then break fi # 输出变量值 echo ${!varname} ((i++)) done
为什么你的写法不生效?
$var$i会被shell先解析$var(你未定义这个变量,结果为空),再拼接$i的值,最终输出的是1、2这类数字,而非var1、var2的实际值。${var[i]}是数组元素的访问语法,但你并没有定义数组var,而是单独定义了var1、var2两个独立变量,因此这个写法无法生效。
更推荐的实现方式:使用数组
如果可以调整变量定义方式,直接用数组会更直观易维护,完全不需要处理变量名递增的问题:
#!/bin/ksh # 定义数组 var=("Hi" "world") # 遍历数组输出所有元素 for val in "${var[@]}"; do echo "$val" done
内容的提问来源于stack exchange,提问作者xLioneth
相关产品推荐
相关产品推荐

