ループ内にいる間にループによって順番に名前が付けられた変数にアクセスするにはどうすればよいですか?
質問
ループ内で(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}を使用して間接的に変数を参照することもできます
所属していません StackOverflow