簡體   English   中英

Bash-擴展變量嵌套在變量中

[英]Bash - expanding variable nested in variable

Noble StackOverflow閱讀器,

我有一個逗號分隔的文件,我將其每一行放入一個數組中。 數據看起來像這樣...

25455410,GROU,AJAXa,GROU1435804437
25455410,AING,EXS3d,AING4746464646
25455413,TRAD,DLGl,TRAD7176202067

有103行,我能夠毫無問題地生成103個數組。

n=1; while read -r OrdLine; do
    IFS=',' read -a OrdLineArr${n} <<< "$OrdLine"
    let n++
done < $WkOrdsFile

但是,我只能這樣訪問數組...

echo "${OrdLineArr3[0]}  <---Gives 25455413

我無法使用數字1-103作為變量來訪問它-例如,以下操作不起作用...

i=3
echo "${OrdLineArr${i}[0]}

導致...

./script2.sh: line 24: ${OrdLineArr${i}[0]}: bad substitution

我認為答案可能涉及“評估”,但我似乎找不到合適的例子來借鑒。 如果有人可以解決這個問題,那么上面的代碼將使bash中的2d數組替換變得非常容易!

非常感謝您的提前幫助!

您可以使用間接擴展 例如,如果$keyOrdLineArr4[7] ,則${!key} (帶有感嘆號)表示${OrdLineArr4[7]} (請參見Bash參考手冊 》中的第3.5.3節“ Shell參數擴展” ,盡管可以承認這段文字並不能真正解釋間接擴展與數組的交互方式。)

我建議將其包裝在一個函數中:

function OrdLineArr () {
    local -i i="$1"          # line number (1-103)
    local -i j="$2"          # field number (0-3)
    local key="OrdLineArr$i[$j]"
    echo "${!key}"
}

然后您可以編寫:

echo "$(OrdLineArr 3 0)"        # prints 25455413
i=3
echo "$(OrdLineArr $i 0)"       # prints 25455413

顯然,這並不是二維數組的完全替代,但是它將滿足您的需要。 不使用eval

eval通常不是一個好主意,但是您可以使用以下方法實現:

eval echo "\${OrdLineArr$i[0]}"

我將每一行存儲在一個數組中,但按需拆分:

readarray OrdLineArr < $WkOrdsFile
...
OrdLine=${OrdLineArr[i]}
IFS=, read -a Ord <<< "$OrdLine"

但是, bash並沒有真正用於數據處理。 它旨在促進流程和文件管理。 您應該考慮使用其他語言。

暫無
暫無

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

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