如何在 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)
我怎样才能做到这一点?
使用bash 4.3,declare -n aliasName=destVarName将使aliasName指destVarName,即使阵列; 因此允许任何类型的分配、取消引用等。否则你会使用。
#!/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)