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
我认为答案可能涉及'eval',但我似乎无法找到适合借用的例子。如果有人可以解决这个问题,那么上面的代码可以很容易地在bash中替换2d数组!
非常感谢你提前帮助!
丹
答案 0 :(得分:1)
您可以使用间接扩展。例如,如果$key
为OrdLineArr4[7]
,则${!key}
(带感叹号)表示${OrdLineArr4[7]}
。 (参见§3.5.3 "Shell Parameter Expansion" in the Bash Reference Manual,虽然可以肯定这篇文章没有真正解释间接扩展如何与数组交互。)
我建议将其包装在一个函数中:
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
。
答案 1 :(得分:0)
eval
通常是一个坏主意,但您可以使用:
eval echo "\${OrdLineArr$i[0]}"
答案 2 :(得分:0)
我会将每一行存储在一个数组中,但需要按需分割:
readarray OrdLineArr < $WkOrdsFile
...
OrdLine=${OrdLineArr[i]}
IFS=, read -a Ord <<< "$OrdLine"
但是,bash
并不适合数据处理;它旨在促进流程和文件管理。您应该考虑使用其他语言。