我在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 [@]}确实给了我价值。有关于此的任何想法?
答案 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
;嵌套有效。)