bash中的动态数组变量名

时间:2018-02-12 17:00:40

标签: arrays bash

如何在bash中使用动态数组变量名?

numCounter=1
arrayIndex=0

arr$numCounter[$arrayIndex]=0
((arrayIndex++))
arr$numCounter[$arrayIndex]=1

我希望这会回来的是

arr1[0] is 0
arr1[1] is 1

我想要做的是拥有n个数组并在每个数组中存储x个文件。

var1=1
arrayFolder(var1)[index0] = file1
arrayFolder(var1)[index1] = file2
arrayFolder(var1)[index2] = file3

var1=2  
arrayFolder(var1)[index0] = file4
arrayFolder(var1)[index1] = file5
arrayFolder(var1)[index2] = file6

Expected result
arrayFolder1[0]=file1
arrayFolder1[1]=file2
arrayFolder1[2]=file3
arrayFolder2[0]=file4
arrayFolder2[1]=file5
arrayFolder2[2]=file6

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:4)

使用bash 4.3,declare -n aliasName=destVarNamealiasName引用destVarName甚至是数组;因此允许任何类型的任务,解除引用,和c。否则你会用。

#!/usr/bin/env bash
#          ^^^^^^^^ - Use bash version from PATH; on MacOS, this should be newer
#                     than the system one if MacPorts, Homebrew, etc. is installed.

case $BASH_VERSION in
  ''|[1-3]*|4.[0-2]*) echo "This code requires bash 4.3 or newer" >&2; exit 1;;
esac

# to make "index0", "index1", &c. valid indexes, our arrays need to be associative
declare -A arrayFolder1 arrayFolder2

var1=1
declare -n curArrayFolder=arrayFolder$var1
curArrayFolder[index0]=file1
curArrayFolder[index1]=file2
curArrayFolder[index2]=file3
unset -n curArrayFolder

var1=2  
declare -n curArrayFolder=arrayFolder$var1
curArrayFolder[index0]=file4
curArrayFolder[index1]=file5
curArrayFolder[index2]=file6
unset -n curArrayFolder

...将适当地导致以下情况:

declare -p arrayFolder1 arrayFolder2

作为输出发出:

declare -A arrayFolder1=([index0]="file1" [index1]="file2" [index2]="file3" )
declare -A arrayFolder2=([index0]="file4" [index1]="file5" [index2]="file6" )

如果您想尝试减少切换当前文件夹所需的命令数量,请考虑一个函数:

setCurArrayFolder() {
  declare -p curArrayFolder &>/dev/null && unset -n curArray
  declare -g -n curArrayFolder="arrayFolder$1"
  var1=$1
}

然后代码变为:

setCurArrayFolder 1
curArrayFolder[index0]=file1
curArrayFolder[index1]=file2
curArrayFolder[index2]=file3

setCurArrayFolder 2
curArrayFolder[index0]=file4
curArrayFolder[index1]=file5
curArrayFolder[index2]=file6

答案 1 :(得分:0)

您可以使用declare和变量间接。

#!/bin/bash
numCounter=1
arrayIndex=0

assign () {
    sub="sub$1[$2]"
    declare -g $sub=$3
}

get () {
    r="sub$1[$2]"
    echo "${!r}"
}

assign $numCounter $arrayIndex 0

((arrayIndex++))
assign $numCounter $arrayIndex 1

((numCounter++))
assign $numCounter 0 2

echo $(get 1 0) is 0
echo $(get 1 1) is 1
echo $(get 2 0) is 2

答案 2 :(得分:0)

可以使用关联数组模拟多维数组,其中多个值连接到每个键中。例如,您可以使用冒号,连接两个数字:

declare -A arrayFolder

var1=1
arrayFolder[$var1,$index0]=file1
arrayFolder[$var1,$index1]=file2
arrayFolder[$var1,$index2]=file3

var1=2  
arrayFolder[$var1,$index0]=file4
arrayFolder[$var1,$index1]=file5
arrayFolder[$var1,$index2]=file6

结果:

$ declare -p arrayFolder
declare -A arrayFolder='([2,0]="file4" [2,1]="file5" [2,2]="file6" [1,2]="file3" [1,1]="file2" [1,0]="file1" )'