【问题标题】:How can I access variables that are named sequentially by a loop while still inside of the loop?如何在循环内部访问由循环按顺序命名的变量?
【发布时间】:2010-11-05 01:22:01
【问题描述】:

我试图了解是否可以在循环中创建一组基于另一个变量(使用 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 的降价。

【问题讨论】:

    标签: bash variables loops eval


    【解决方案1】:

    试试这个:

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

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

    【讨论】:

    • 啊哎呀,已修复,所以它现在可以满足他的要求了 :)
    【解决方案2】:

    使用间接:

    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
    

    不需要另一个评估。

    【讨论】:

    • 效果很好。我不确定我是否理解间接部分。但它既可以按照您编写的方式工作,也可以作为 echo $var
    • 例如,echo $var 会给出“count1”。 echo ${!var} 给出 var 内容的内容,即“1195”。 echo ${!var} 的作用类似于 echo $(eval echo \$$var)
    【解决方案3】:

    不完全回答你的问题,但是......你知道 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 正式培训 + 作为系统管理员的全职工作意味着我通常必须学习新技能,因为我需要它们。我尽量不要太超前,因为我担心我不会吸收它。不过很棒的回复。在我已经基本理解的东西中看到数组语法对我的一般理解有很大帮助。除了清洁之外,在这种情况下还有其他优势吗?内置命令与外部命令的数量仍然相同吗?
    • 我认为这是执行此操作的“正确”方式。但是,语法可能会有点难看,echo 语句就是明证。如果没有数组,您必须对其进行更多评估(根据 cma 的回答)。顺便说一句,我从上到下阅读了man bash 页面十几次,但每次我再次阅读它时,我仍然发现一个新的很棒的“你一生都在哪里”功能。 ;-)
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      相关资源
      最近更新 更多