Как я могу получить доступ к переменным, которые названы последовательно в цикле, пока еще внутри цикла? - PullRequest
1 голос
/ 23 июня 2009

Я пытаюсь понять, возможно ли создать набор переменных, которые пронумерованы на основе другой переменной (используя eval) в цикле, а затем вызвать его до завершения цикла.

В качестве примера я написал скрипт под названием вопрос (команда fist показывает содержимое переменной $ 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

Это именно то, что я ожидал, но есть ли способ переместить команды echo внутри цикла before, чтобы часть цикла отображала значение только что созданной переменной. Что-то вроде:

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.

Ответы [ 4 ]

1 голос
/ 23 июня 2009

Используйте косвенное обращение:

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

Нет необходимости в другом eval.

1 голос
/ 23 июня 2009

Не совсем отвечаю на ваш вопрос, но ... вы знали, что 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
0 голосов
/ 23 июня 2009

Да, вот так (по крайней мере, в bash):

$ count1=xyz
$ seq=1
$ value=`eval echo \$\{count$seq\}`
$ echo $value
0 голосов
/ 23 июня 2009

Попробуйте это:

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

некоторые версии оболочки также позволяют использовать $ {! Var} для косвенной ссылки на переменные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...