我试图了解是否可以在循环中创建一组基于另一个变量(使用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循环中移动echo命令,以便循环的一部分回显刚刚创建的变量的值。类似的东西:
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的降价。
答案 0 :(得分: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
答案 1 :(得分: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
无需其他评估。
答案 2 :(得分:0)
试试这个:
varName=a
for i in 1 2 3
do
eval $varName$i=stuff
eval var=\$$varName$i
echo $var
done
某些版本的shell也允许你使用$ {!var}来间接引用变量
答案 3 :(得分:0)
是的,就像这样(至少在bash中):
$ count1=xyz
$ seq=1
$ value=`eval echo \$\{count$seq\}`
$ echo $value