【问题标题】:Dynamic array variable name in bashbash中的动态数组变量名
【发布时间】:2018-07-22 22:22:14
【问题描述】:

如何在 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

我怎样才能做到这一点?

【问题讨论】:

  • 您最近不是问过这个问题并得到了重复的问题指针吗?展示您如何尝试应用该答案以及如何失败会有所帮助。
  • declare "arr$numCounter[$arrayIndex]"=0; ((arrayIndex++)); declare "arr$numCounter[$arrayIndex]"=1 应该可以工作
  • (...ahh, assign to a bash array indirectly by dynamically constructed variable 是我结束您之前的问题的答案。这个问题比您昨天的上一个问题好多问 - 并且 谢谢你付出的努力;既然你付出了努力,我假设你也有一个独特而独特的问题,但对我来说,这个问题没有被涵盖的地方仍然不明显前一个;你能edit 更明确一点吗?)
  • (要清楚——这个问题问得足够好,即使它最终被当作骗子关闭,我也会要求你不要删除它——好的重复项会为网站只要他们设置了额外的搜索词,将某人引导到我们认为是规范实例的任何问题)。

标签: arrays bash


【解决方案1】:

使用 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

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

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

【讨论】:

  • 我错过了声明 -A 并且未设置。如何读取数组?我试过echo ${curArrayFolder1[0]}echo ${arrayFolder1[0]} 并没有与之相关的价值。
  • 在上面的例子中,实际上是${curArrayFolder1[index0]} 设置了值,而不是${curArrayFolder1[0]}(因为“index0”是您在问题中使用的例子)。 declare -A 对间接数组赋值不是必需的,但 必须能够具有非数字数组索引,例如 index0 而不是 0
  • 我正在为数组索引使用一个变量。数字数组索引似乎有效。谢谢这工作。
【解决方案2】:

您可以使用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

【讨论】:

    【解决方案3】:

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

    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" )'
    

    【讨论】:

      猜你喜欢
      • 2017-11-06
      • 2013-05-09
      • 2022-11-24
      • 1970-01-01
      • 2014-07-12
      相关资源
      最近更新 更多