Come posso accedere alle variabili che sono nominate in sequenza da un loop mentre sono ancora all'interno del loop?

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

  •  06-07-2019
  •  | 
  •  

Domanda

Sto cercando di capire se è possibile creare un insieme di variabili che sono numerate in base a un'altra variabile (usando eval) in un ciclo, e quindi richiamarlo prima che il ciclo finisca.

Come esempio ho scritto uno script chiamato domanda (Il comando pugno è mostrare qual è il contenuto della variabile $ 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

Quando eseguo questo ottengo

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

Che è esattamente quello che mi aspetterei, ma c'è un modo per spostare i comandi echo all'interno del ciclo until in modo che parte del ciclo stia facendo eco al valore della variabile appena creata. Qualcosa del tipo:

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

PS: mi dispiace se la mia formattazione è disattivata ... la prima volta che scrivo qui, e conosco solo il markdown da reddit.

È stato utile?

Soluzione

Usa indiretto:

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

Non c'è bisogno di un altro giudizio.

Altri suggerimenti

Non risponde esattamente alla tua domanda, ma ... sapevi che bash ha variabili di array?

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

O senza array:

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

Sì, in questo modo (almeno in bash):

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

Prova questo:

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

alcune versioni della shell consentono anche di usare $ {! var} per fare riferimento indirettamente alle variabili

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top