在循环内访问循环变量

在循环内访问循环变量
List = 1 2 3 4 5
for i in $LIST
do
sum=`expr $l_$i + $b`
done

这里l_1l_2l_3l_4l_5是具有某些值的变量。当我尝试使用循环变量访问 for 循环中的这些值时i, i 的值在表达式中被替换,即语句(1 + $b)被执行而不是($l_1 + $b)。我尝试了各种$符号组合,也使用了括号,但似乎没有任何效果。请帮忙!!

答案1

不要使用 l_i 或 list 作为字符串,而是使用数组:

#! /bin/bash
b=11
l=(12 24 46 68 92)
for i in "${l[@]}" ; do
     ((sum=i+b))
     echo $sum
done

答案2

如果您想维护给定的示例,可以使用两种方法:

  1. 使用评估:eval expr \${L_$i} + $b
  2. 使用参考变量:REF=L_$i; expr ${!REF} + $b;

正如提到的 chorobabash区分大小写,所以请小心你的变量名称。

答案3

l_1=10 l_2=20 l_3=30 l_4=40 l_5=50
b=100
for i  in    1 2 3 4 5
do     echo "$((sum=l_$i+b))"
done

的值$sum是在当前 shell 中设置的 - 它可以以正常方式扩展或修改。发生这种情况时,无需为expr每次迭代调用/分叉及其父 shell所需的子 shell/管道开销。

输出:

110
120
130
140
150

或者,如果你真的想使用expr

for i  in  1 2 3 4 5
do     sum=`expr "$((l_$i))" + "$b"`
       echo "$sum"
done

输出:

110
120
130
140
150

答案4

我不是 bash 专家,但这就是我的想法

#!/bin/bash
 b=1
 l_1=1
 l_2=2
 l_3=3
 for i in '$l_'{1,2,3}
 do
   eval dvar="${i}"
   sum=$(($dvar + $b))
 done

for 循环的变量将被初始化为“$l_1”、“$l_2”等。然后调用 eval 将评估以下值进入德瓦尔然后可以在算术表达式中使用。

相关内容