Wie kann ich Variablen zugreifen, während sie noch durch eine Schleife nacheinander genannt werden innerhalb der Schleife?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich versuche zu verstehen, wenn es möglich ist, eine Reihe von Variablen zu erstellen, die nummeriert sind auf einer anderen Variablen basiert (unter Verwendung von eval) in einer Schleife, und dann rufen sie vor den Schlaufenenden.

Als Beispiel ich ein Skript namens Frage geschrieben haben (Die Faust Befehl ist zu zeigen, was der Inhalt der Variable $ Registerkarte)

(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

Als ich dies laufe ich bekommen

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

Das ist genau das, was ich erwarten würde, aber gibt es eine Möglichkeit, die Echo-Befehle innerhalb der Schleife bis zu bewegen, so dass ein Teil der Schleife des Wertes der Variablen wird Echo, die gerade erstellt wurde. So etwas wie:

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

PS:. Sorry, wenn meine Formatierung ab ... erstes Mal Entsendung hier, und ich kenne nur Abschlag von reddit

War es hilfreich?

Lösung

Mit indirection:

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

Keine Notwendigkeit für eine andere eval.

Andere Tipps

beantworten nicht genau Ihre Frage, aber ... wusstest du bash hat Array-Variablen?

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[*]}

oder ohne Arrays:

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

Ja, wie diese (in bash mindestens):

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

Versuchen Sie folgendes:

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

einige Versionen von Shell lassen Sie auch $ {! Var} indirekt Variablen Referenz

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top