2015-08-13 83 views
0

我在Stackoverflow上發現了幾個類似的問題,但無法提取必要的bash ninja,所以我來帽子手中,以便有人向我暗示。 我正在使用bash腳本來下載一些貨幣報價。引號是在一個大的文本文件中,我使用grep並剪切來提取它們。到現在爲止還挺好。所有的報價都是針對美元的。我從一個月前和一年前的當前費率下載了三個文件。 這裏是我使用'declare'動態設置變量名稱的代碼。這一點工作正常。Bash shell腳本:動態生成數組變量

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[USD]} = 0.65 
${GBP[USD_M]} = 0.63 
${GBP[USD_Y]} = 0.70 etc. 

權,所以後來我通過每一種貨幣要循環,併產生相互每種貨幣的價值。即獲得$ {GBP [HKD]} $ {GBP [EUR]} $ {HKD [GBP]} $ {HKD [EUR]} $ {EUR [HKD]} $ {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它,我得到的消息「壞替代」。 我一直在反覆嘗試各種各樣的東西,甚至在其他問題中標記爲verboten的其他方法(所以我不會在這裏討論它們)。有人能指引我朝着正確的方向嗎?如果有幫助,使用Bash 4.3。

紅利問題。在我的調試中,我一直試圖使用echo $ {!HKD [@]}來查看密鑰名稱。儘管互聯網上到處都是這樣寫的,但它不起作用。儘管$ {HKD [@]}確實給了我值。有關於此的任何想法?

+0

該最終回聲陳述的輸出樣本爲 ** declare HKD [GBP] ='echo $ {HKD [USD]}/$ {GBP [USD]} | bc' ** 對eval做的而不是echo不會增加變量。 – plutocrat

回答

0

你不需要eval;你只需要間接參數擴展。更換

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

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

(儘管語法着色這裏,$(...)裏面的雙引號是從雙引號引起整個參數declare不同;嵌套的作品。)

+0

謝謝。這似乎也是一樣,也是......我學到了一個新的訣竅!其實兩個:<<<而不是回聲對我來說是一個新的。 所以現在爲什麼 '回聲$只是神祕{!HKD [@]}' 沒有列出任何東西。也許我應該把它放在另一個問題上。 – plutocrat

+0

也許。目前還不清楚爲什麼這是行不通的,因爲'HKD'是一個關聯數組,不管它是如何聲明。 – chepner

0

Argh。好的,那麼在可能的糟糕形式中,我正在回答我自己的問題。顯然我已經接近它了,我只需要調整回聲/評估線。這一個工作 eval "declare $CURRENCY[${TARGETCURRENCY}]=\$(echo \${$CURRENCY[USD]}/\${$TARGETCURRENCY[USD]} | bc)" 看來問題的一部分是,我使用的是傳統的反引號形式。將它改爲$()似乎是解決問題的方法,雖然我也改變了很多其他的東西,所以很難說我什麼時候得到了這個神奇的公式。

好的,這樣就留下了爲什麼$ {!HKD [@]}不能用於列出鍵/索引名稱的問題。