Wie kann ich Variablen zugreifen, während sie noch durch eine Schleife nacheinander genannt werden innerhalb der Schleife?
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
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