2014-03-02 94 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

相關問題