如何创建名称包含变量的数组?

时间:2019-09-03 14:56:02

标签: bash

我在编写包含Bash中变量字符串的命令时遇到了一些麻烦,想知道正确的方法。

我想尝试用数字1-9填充Row数组,但是在尝试传递变量Row $ Line [$ i] = $ i时遇到问题。

Row0=()
Row1=()
Row2=()

FillArrays() {
for Line in $(seq 0 2)
do
    for i in $(seq 1 9)
    do
        Row$Line[$i]=$i
    done
done

}

如果我回显命令,我可以得到期望的结果,但是我认为那仅仅是因为它是一个字符串。

我希望for循环选择每一行并在每个数组中添加数字1-9。

2 个答案:

答案 0 :(得分:3)

FillArrays() {
  for ((Line=0; Line<8; Line++)); do
    declare -g -a "Row$Line"          # Ensure that RowN exists as an array
    declare -n currRow="Row$Line"     # make currRow an alias for that array
    for ((i=0; i<9; i++)); do         # perform our inner loop...
      currRow+=( "$i" )               # ...and populate the target array...
    done
    unset -n currRow                  # then clear the alias so it can be reassigned later.
  done
}

参考文献:

答案 1 :(得分:0)

变量扩展发生得太晚了,以至于作业无法理解。您可以使用内置的declare来延迟分配。函数中需要-g才能使变量成为全局变量。

此外,您可能不想使用$Line作为数组索引,而希望使用$i,否则,您将不会使用数字1..9填充每个行数组。

#! /bin/bash
Row0=()
Row1=()
Row2=()

FillArrays() {
    for Line in $(seq 0 8)
    do
        for i in $(seq 1 9)
        do
            declare -g Row$Line[$i]=$i
        done
    done
}

FillArrays
echo "${Row1[@]}"

但是请注意,将变量用作变量名的一部分是危险的。对我来说,需要这个总是意味着我需要从Shell切换到真正的编程语言。