I'm trying to understand if it's possible to create a set of variables that are numbered based on another variable (using eval) in a loop, and then call on it before the loop ends.
As an example I've written a script called question (The fist command is to show what is the contents of the variable $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
When I run this I get
(23:32:23\[deco@S.Man)
[~/bin]$ ./question
1195
1471
1538
1409
Which is exactly what I would expect, but is there a way to move the echo commands inside of the until loop so that part of the loop is echoing the value of the variable that was just created. Something like:
until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
echo "$count$seq"
done
can you put set -x in the second line of your file "question" and paste the output here...
This is the output with set -x command added:
(16:48:46\[deco@S.Man)
[~/bin]$ ./question
++ listQpsk 40
++ grep -w '[1-4]'
+ tab=' 40 SMANHUBAQPSK1 1 1342 1194 88
40 SMANHUBAQPSK1 2 1668 1464 87
40 SMANHUBAQPSK1 3 1883 1535 81
40 SMANHUBAQPSK1 4 1685 1399 83'
+ seq=1
+ num=4
+ [[ 1 -gt 4 ]]
++ echo ' 40 SMANHUBAQPSK1 1 1342 1194 88
40 SMANHUBAQPSK1 2 1668 1464 87
40 SMANHUBAQPSK1 3 1883 1535 81
40 SMANHUBAQPSK1 4 1685 1399 83'
++ grep -w 1
++ awk '{print $5}'
+ eval count1=1194
++ count1=1194
+ seq=2
+ [[ 2 -gt 4 ]]
++ echo ' 40 SMANHUBAQPSK1 1 1342 1194 88
40 SMANHUBAQPSK1 2 1668 1464 87
40 SMANHUBAQPSK1 3 1883 1535 81
40 SMANHUBAQPSK1 4 1685 1399 83'
++ grep -w 2
++ awk '{print $5}'
+ eval count2=1464
++ count2=1464
+ seq=3
+ [[ 3 -gt 4 ]]
++ echo ' 40 SMANHUBAQPSK1 1 1342 1194 88
40 SMANHUBAQPSK1 2 1668 1464 87
40 SMANHUBAQPSK1 3 1883 1535 81
40 SMANHUBAQPSK1 4 1685 1399 83'
++ grep -w 3
++ awk '{print $5}'
+ eval count3=1535
++ count3=1535
+ seq=4
+ [[ 4 -gt 4 ]]
++ echo ' 40 SMANHUBAQPSK1 1 1342 1194 88
40 SMANHUBAQPSK1 2 1668 1464 87
40 SMANHUBAQPSK1 3 1883 1535 81
40 SMANHUBAQPSK1 4 1685 1399 83'
++ grep -w 4
++ awk '{print $5}'
+ eval count4=1399
++ count4=1399
+ seq=5
+ [[ 5 -gt 4 ]]
+ echo 1194
1194
+ echo 1464
1464
+ echo 1535
1535
+ echo 1399
1399
However I was able to find a working solution to my problem:
(16:48:50\[deco@S.Man)
[~/bin]$ cat orig.question
#!/usr/bin/bash
tab=`listQpsk 40|grep -w [1-4]`
seq=1
num=4
until [[ $seq -gt $num ]];do
var="count$seq"
eval var=`echo "$tab"|grep -w $seq|awk '{print $5}'`
echo $var
seq=$(($seq+1))
done
(16:50:12\[deco@S.Man)
[~/bin]$ ./orig.question
1194
1464
1534
1399