如何在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
我怎样才能做到这一点?
答案 0 :(得分:4)
使用bash 4.3,declare -n aliasName=destVarName
会aliasName
引用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" )'