簡體   English   中英

Bash Shell腳本:動態生成數組變量

[英]Bash shell script: dynamically generating array variables

我在Stackoverflow上發現了一些類似的問題,但是無法提取必要的bash忍者,所以我要親自給別人提供線索。我正在使用bash腳本下載一些貨幣報價。 引號在一個大的文本文件中,我使用grep並剪切以提取它們。 到現在為止還挺好。 所有報價均兌美元。 我從一個月前和一年前的當前費率下載了三個文件。 這是我使用'declare'動態設置變量名的代碼。 這一點工作正常。

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 [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嘗試各種方法,甚至在其他問題中嘗試其他標記為verboten的方法(因此在這里我不會煩惱它們)。 有人可以指出我正確的方向嗎? 如果有幫助,請使用Bash 4.3。

獎金問題。 在調試中,我一直在嘗試使用echo $ {!HKD [@]}查看密鑰名稱。 盡管互聯網上到處都寫着所有東西,但它不起作用。 盡管$ {HKD [@]}確實為我提供了這些值。 有什么想法嗎?

好的,所以我可能會以一種不好的形式回答我自己的問題。 顯然我快要掌握了,我只需要調整回聲/評估線。 這個eval "declare $CURRENCY[${TARGETCURRENCY}]=\\$(echo \\${$CURRENCY[USD]}/\\${$TARGETCURRENCY[USD]} | bc)"有效, eval "declare $CURRENCY[${TARGETCURRENCY}]=\\$(echo \\${$CURRENCY[USD]}/\\${$TARGETCURRENCY[USD]} | bc)"看來問題的一部分在於,我正在使用舊的反引號形式。 將其更改為$()似乎是解決問題的方法,盡管我也更改了許多其他內容,所以很難說出何時獲得了魔術公式。

好的,這樣就剩下一個問題了,為什么$ {!HKD [@]}無法列出鍵/索引名稱。

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

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

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

(盡管此處使用語法着色,但$(...)中的雙引號與將整個參數括起來進行declare的雙引號不同;嵌套有效。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM