[英]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數組替換變得非常容易!
非常感謝您的提前幫助!
擔
您可以使用間接擴展 。 例如,如果$key
是OrdLineArr4[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.