1

我试图了解是否可以在循环中创建一组基于另一个变量(使用 eval)编号的变量,然后在循环结束之前调用它。

例如,我编写了一个名为 question 的脚本(第一个命令是显示变量 $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 命令移动到 until 循环内,以便循环的一部分回显刚刚创建的变量的值。就像是:

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

4 回答 4

1

不完全回答你的问题,但是......你知道 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
于 2009-06-23T03:53:32.783 回答
1

使用间接:

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

不需要另一个评估。

于 2009-06-23T11:04:45.443 回答
0

试试这个:

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

某些版本的 shell 还允许您使用 ${!var} 来间接引用变量

于 2009-06-23T03:54:39.100 回答
0

是的,像这样(至少在 bash 中):

$ count1=xyz
$ seq=1
$ value=`eval echo \$\{count$seq\}`
$ echo $value
于 2009-06-23T04:09:43.233 回答