bash中的动态数组变量名

the*_*963 1 arrays bash

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

numCounter=1
arrayIndex=0

arr$numCounter[$arrayIndex]=0
((arrayIndex++))
arr$numCounter[$arrayIndex]=1
Run Code Online (Sandbox Code Playgroud)

我希望这会回来的是

arr1[0] is 0
arr1[1] is 1
Run Code Online (Sandbox Code Playgroud)

我想要做的是有 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
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Cha*_*ffy 5

使用bash 4.3,declare -n aliasName=destVarName将使aliasNamedestVarName即使阵列; 因此允许任何类型的分配、取消引用等。否则你会使用。

#!/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
Run Code Online (Sandbox Code Playgroud)

...将正确导致以下情况:

declare -p arrayFolder1 arrayFolder2
Run Code Online (Sandbox Code Playgroud)

作为输出发出:

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

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

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

然后代码变成:

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

setCurArrayFolder 2
curArrayFolder[index0]=file4
curArrayFolder[index1]=file5
curArrayFolder[index2]=file6
Run Code Online (Sandbox Code Playgroud)