Bash shell脚本:动态生成数组变量

时间:2015-08-13 09:19:55

标签: arrays bash shell

我在Stackoverflow上发现了一些类似的问题,但却无法提取必要的bash忍者,所以我来为某人提供线索。 我使用bash脚本下载了一些货币报价。引号位于一个大文本文件中,我使用grep和cut来提取它们。到现在为止还挺好。所有报价均反对美元。我从一个月前和一年前的当前费率下载了三个文件。 这是我提出的使用'声明'的代码。动态设置变量名称。这个位工作正常。

for CURRENCY in GBP HKD EUR
do
    # Get rates against USD
    declare -A $CURRENCY
    TODAY=`grep $CURRENCY today.json | cut -f 2 -d: | tr -d "," | tr -d " "`
    MONTH=`grep $CURRENCY month.json | cut -f 2 -d: | tr -d "," | tr -d " "`
    YEAR=`grep $CURRENCY year.json | cut -f 2 -d: | tr -d "," | tr -d " "`
    declare ${CURRENCY}[USD]=$TODAY
    declare ${CURRENCY}[USD_M]=$MONTH
    declare ${CURRENCY}[USD_Y]=$YEAR
    # Get inverse rate
    declare ${CURRENCY}[USD_I]=`echo "scale=5; 1/$TODAY" | bc`
    declare ${CURRENCY}[USD_M_I]=`echo "scale=5; 1/$MONTH" | bc`
    declare ${CURRENCY}[USD_Y_I]=`echo "scale=5; 1/$YEAR" | bc`

done

现在,对于每种货币,例如。 GBP,我有一个像这样的键值对的数组:

${GBP[USD]} = 0.65
${GBP[USD_M]} = 0.63
${GBP[USD_Y]} = 0.70 etc.

是的,那么我想循环每种货币并相互生成每种货币的价值。即获得$ {GBP [HKD]} $ {GBP [EUR]} $ {HKD [GBP]} $ {HKD [EUR]} $ {EUR [GBP]} $ {EUR [HKD]}。这是它开始变得棘手的地方。

我开始尝试另一个循环,错过了货币与自身匹配的情况(汇率= 1)。为了获得第一个值,例如,我想将$ {GBP [USD]}除以$ {HKD [USD]}。

for CURRENCY in GPB HKD EUR
do
   for TARGETCURRENCY in GPB HKD EUR
    do 
    if [ "$TARGETCURRENCY" != "$CURRENCY" ]; then

    echo "declare $CURRENCY[$TARGETCURRENCY]=\`echo \${$CURRENCY[USD]}/\${$TARGETCURRENCY[USD]} | bc\`"
    fi  
         done
done

我可以在上面的循环中回显我想要执行的命令,但是如果我尝试评估它,我会得到消息'错误的替换'。 我已经一遍又一遍地用eval尝试各种各样的事情,甚至在其他问题上用其他方法标记为禁止使用(所以我在这里不知道如何)。有人能指出我正确的方向吗?使用Bash 4.3如果有帮助的话。

奖金问题。在我的调试中,我一直在尝试使用echo $ {!HKD [@]}来查看密钥名称。尽管互联网上到处都写着一切,但它并不起作用。虽然$ {HKD [@]}确实给了我价值。有关于此的任何想法?

1 个答案:

答案 0 :(得分:0)

您不需要eval;你只需要间接参数扩展。取代

declare $CURRENCY[$TARGETCURRENCY]=\`echo \${$CURRENCY[USD]}/\${$TARGETCURRENCY[USD]} | bc\`

numerator=$CURRENCY[USD]
denominator=$TARGETCURRENCY[USD]
declare "$CURRENCY[$TARGETCURRENCY]=$(bc <<< "${!numerator}/${!denominator}")"

(尽管这里的语法着色,$(...)内的双引号与将整个参数括起来的双引号不同于declare;嵌套有效。)