2014-03-02 92 views
1

我想创建多个数组,其中包含引用另一个数组中元素数的文件名的随机列表。我怎样才能将一个$ cntr var(以cntr = 0开头)追加到新数组名称的末尾,以便直接引用其他数组中的元素?如何使用相同的基名枚举多个数组

哇,我希望看起来有点明智。下面是我得到了什么事情,到目前为止,我希望可以帮助让我的意思更清楚地认识:

function fGenRanList() { 
    cntr=0 
    while [[ "$cntr" -lt "${#mTypeAr[@]}" ]] ; do 
     n="${nAr[$cntr]}" ; echo "\$n: $n" 
      tracks${cntr}=() ; echo "\$tracks${cntr}: $tracks${cntr}" 
     while ((n > 0)) && IFS= read -rd $'\0' ; do 
      tracks${cntr}+=("$REPLY") 
      ((n--)) 
     done < <(sort -zuR <(find "${dirAr[$cntr]}" -type f \(-name '*.mp3' -o -name '*.ogg' \) -print0)) 
     ((cntr++)) 
    done 
} 

错误我得到的是:

/home/user/bin/ranSong_multDirs.sh: line 95: syntax error near unexpected token `"$REPLY"' 
/home/user/bin/ranSong_multDirs.sh: line 95: `      tracks${cntr}+=("$REPLY")' 

可是我第一次commentted出从回声声明跟踪$ {cntr} =()数组初始化以摆脱类似的错误,但不确定跟踪$ {cntr}是否被初始化。

最后,我应该使用存储在数组$ {nAr [$ cntr]}中的数值var来确定与$ {#mTypeAr [@]}中的元素一样多的track(n)数组来确定每个音轨阵列将包含多少个元素。

也许我正在做的事情比需要更困难,试图将数组实现到更老的脚本我都为了使它们更有效率,但我想主要是为了更好地使用BASH数组为类似的多个进程存储变量,我似乎经常在脚本中执行这些进程。

回答

0

改变这一行,这是无效的bash语法,

tracks${cntr}+=("$REPLY") 

declare "tracks${cntr}+=($REPLY)" 

不是有语法分配,declare命令需要一个字符串*外观*就像一个作为论点的转让;这样的说法是由shell处理的第一,所以如果cntr是目前3和$REPLYfoo,所执行的实际分配是

tracks3+=(foo) 

declare的命令给你间接在使参数分配的水平。

+0

如何访问数组中的元素?当我尝试回显“$ {tracks $ cntr [0]}”例如我得到“坏代替错误 – nanker

+0

顺便说一句,我有过去需要这样的解决方案几次,所以如果这可以工作,我可以理解那么我怎么看到再次使用这个......除非在bash中有创建数组的数组 – nanker

+0

间接扩展数组元素的语法有点奇怪,对于一个普通的变量,你只需要做一些类似'对于数组,您必须将索引视为变量名称的一部分。var =“tracks $ ctr [0]”; echo $ {!var} foo = 5; bar = foo; echo $ {!bar}'。 '。 – chepner

相关问题