ループ内にいる間にループによって順番に名前が付けられた変数にアクセスするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1030532

  •  06-07-2019
  •  | 
  •  

質問

ループ内で(evalを使用して)別の変数に基づいて番号付けされた変数のセットを作成し、ループが終了する前に呼び出すことができるかどうかを理解しようとしています。

例として、questionというスクリプトを記述しました(最初のコマンドは、変数$ tabの内容を表示することです)

(23:32:12\[deco@S.Man)
[~/bin]$ listQpsk 40|grep -w [1-4]
40 SMANHUBAQPSK1          1    1344      1195        88
40 SMANHUBAQPSK1          2    1668      1470        88
40 SMANHUBAQPSK1          3    1881      1539        81
40 SMANHUBAQPSK1          4    1686      1409        83


(23:18:42\[deco@S.Man)
[~/bin]$ cat question
#!/usr/bin/bash
tab=`listQpsk 40|grep -w [1-4]`
seq=1
num=4
until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
done
echo $count1
echo $count2
echo $count3
echo $count4

これを実行すると、次のようになります

(23:32:23\[deco@S.Man)
[~/bin]$ ./question 
1195
1471
1538
1409

これはまさに私が期待するものですが、ループの一部が作成されたばかりの変数の値をエコーするように、エコーループをuntilループ内に移動する方法があります。次のようなもの:

until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
echo "$count$seq"
done

PS:書式設定がオフの場合は申し訳ありません...初めてここに投稿し、redditからのマークダウンしか知りません。

役に立ちましたか?

解決

インダイレクションを使用:

until [[ $seq -gt $num ]];do
    var="count$seq"
    eval $var=$(echo "$tab"|awk -v seq=$seq '$3==seq {print $5}') # awk loves to do grep's job
    let seq+=1    # another way
    echo "${!var}"    # indirection
done

別の評価は不要です。

他のヒント

あなたの質問に正確に答えていませんが、... bashには配列変数があることをご存知ですか?

seq=1
num=4
until [[ $seq -gt $num ]];do
count[$seq]=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
done
echo ${count[*]}

または配列なし:

seq=1
num=4
until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
eval echo \$count$seq
seq=$(($seq+1))
done

はい、このように(少なくともbashで):

$ count1=xyz
$ seq=1
$ value=`eval echo \$\{count$seq\}`
$ echo $value

これを試してください:

varName=a
for i in 1 2 3
do
   eval $varName$i=stuff
   eval var=\$varName$i
   echo $var
done

シェルの一部のバージョンでは、$ {!var}を使用して間接的に変数を参照することもできます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top