Bash - 扩展变量嵌套在变量中

时间:2013-11-17 01:15:31

标签: arrays bash variables multidimensional-array expansion

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数组!

非常感谢你提前帮助!

3 个答案:

答案 0 :(得分:1)

您可以使用间接扩展。例如,如果$keyOrdLineArr4[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并不适合数据处理;它旨在促进流程和文件管理。您应该考虑使用其他语言。