如何在while循环中动态使用变量

如何在while循环中动态使用变量

在 Unix 中执行以下命令时出现错误:我希望第 3 行能够工作...在 ksh shell 中

while [ ${i} -le 3 ]
do
     var${i}="hello${i}"
     echo "${var}${i}"
     i=`expr ${i} + 1`
done

我想要得到如下所示的输出,

hello1
hello2

答案1

在 POSIX 中sh,您需要eval使用具有动态名称的变量。

i=0
while [ "$i" -le 3 ]
do
   eval '
     var'"$i"'="hello${i}"
     echo "var$i = ${var'"$i"'}"
   '
   i=$((i+1))
done
echo "${var1}"

使用时eval,至关重要的是确保只有需要扩展的变量在传递给的参数中扩展eval(并且它们的值被清理(这里我们知道它们是安全的十进制数字序列))。

上面仅$i扩展了其中的两个。为此,我们摆脱单(强)引号并插入$i内部双引号:eval '...'"$i"'...'

因为正确引用非常困难(如果不正确引用就会很危险),所以最好eval尽可能限制使用。理想情况下,仅将动态变量的内容传输到静态变量和/或返回,例如:

i=0
while [ "$i" -le 3 ]
do
   var=hello$i # $var with static name
   eval "var$i=\$var" # transfer into variable with dynamic name

   echo "var$i = $var" # use var with static name instead of dynamic one
                       # everywhere else (for which we don't need eval)

   i=$((i+1))
done
echo "${var2}"

ksh// zsh/中bashyash您可能想改用数组(或 中的关联数组ksh93zsh或 的最新版本bash)。请注意,ksh/bash数组索引从 开始0,并且数组是稀疏的(更像是键限于正整数的关联数组),而在所有其他 shell(包括zshyash在类似 Bourne 的前端)中,索引从 1 开始,数组是普通数组。

ksh/ bash/ zsh -o ksharrays

unset -v var
i=0; while [ "$i" -le 3 ]; do
  var[i]=hello$i
  echo "var[$i]=${var[i]}"
  i=$((i+1))
done
echo "${var[1]}"

或者使用//常见的 POSIX 语法的((...))另一个扩展:shkshzshbash

unset -v var
i=0; while ((i <= 3)); do
  var[i]=hello$i
  echo "var[$i]=${var[i]}"
  ((++i))
done
echo "${var[2]}"

或者用ksh93, bash, zsh -o ksharrays

unset -v var
for ((i = 0; i <= 3; i++)); do
  var[i]=hello$i
  echo "var[$i]=${var[i]}"
done
echo "${var[3]}"

答案2

使用循环就容易多了for

for i in 1 2 3; do
  echo var$i\ =\ hello$i
done

测试于bash.

相关内容