ループ内のループ変数にアクセスする

ループ内のループ変数にアクセスする
List = 1 2 3 4 5
for i in $LIST
do
sum=`expr $l_$i + $b`
done

ここで、、、およびはl_1特定l_2l_3値を持つ変数です。ループ変数を使用してforループからこれらの値にアクセスしようとすると、式はi値を置き換えます。つまり、ステートメントが代わりに実行されます。さまざまな記号の組み合わせを試してみて、括弧も試してみましたが、何も機能しないようです。助けてください! !l_4l_5i(1 + $b)($l_1 + $b)$

答え1

l_iまたはリストを文字列として使用せず、代わりに配列を使用してください。

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

答え2

与えられた例を維持するには、2つのアプローチがあります。

  1. 使用評価:eval expr \${L_$i} + $b
  2. 参照変数を使用してください。REF=L_$i; expr ${!REF} + $b;

前述のように、 chorobはbash大文字と小文字を区別しますので、変数名に注意してください。

答え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現在シェルに設定されており、通常の方法で拡張または変更できます。これが発生した場合、expr各反復ごとに親シェルを呼び出す/フォークするために必要なサブシェル/パイプラインオーバーヘッドは必要ありません。

出力:

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を呼び出すと、次の値が評価されます。入力するディワルその後、算術式に使用できます。

関連情報