2012-04-11 19 views
0

我有一個bash腳本,需要建立一些集合,每個集合包含來自多個隊列的一個元素(我正在考慮使用數組來存儲這些) 例如,如果我有以下隊列:在bash中間接引用的數組的訪問範圍

array1=(a b c e f)                
array2=(x y z)                 
array3=(1 2 3 4) 

我需要獲得下列陣列(一次全部不一定,I過程所得到的陣列一次一個)

 
a x 1 
b y 2 
c z 3 
e 4 
f 

陣列的數目是動態的。

所以基本上我需要彈出每個數組的第一個元素,並放入另一個數組。 我知道可以從一個這樣的數組彈出的第一個元素:

el1=${array1[0]} 
array1=(${array1[@]:1:$((${#array1[@]}))}) 

而且,我知道我可以從一個間接引用的數組這樣提取一個值:

val=$(eval echo \${$arr[0]}) 

我的問題是:我如何重寫從數組中彈出第一個元素以使用間接引用的部分。

以下是完整的測試腳本:

#!/bin/bash 

set -e 
set -u 


array1=(a b c e f) 
array2=(x y z) 
array3=(1 2 3 4) 

finished=false 
while ! $finished; do 
    finished=true 

    array4=() 
    for arr in array1 array2 array3; do 
     val=$(eval echo \${$arr[0]}) 
     if [ ! -z $val ]; then 
     array4=(${array4[@]} $val) 
     $arr=(\${$arr[@]:1:$((\${#$arr[@]}))}) 
     fi 
    done 

    l4=${#array4[@]} 
    if [ $l4 -gt 0 ]; then 
     finished=false 

     for i in ${array4[@]}; do 
     echo $i 
     done 
    fi 

done 

回答

1
array1=(a b c e f)                
array2=(x y z)                 
array3=(1 2 3 4) 

cnt=0 
while : ; do 
    line='' 
    for a in ${!array*}; do    # loop over names "array*" 
    val=$(eval echo \${$a[$cnt]}) 
    line="$line ${val:- }"    # build line 
    done 
    ((cnt++)) 
    [[ $line =~ ^\ +$ ]] && break   # break if line has only blanks 
    echo -e "${line:1}" 
done 

輸出:

a x 1 
b y 2 
c z 3 
e 4 
f  
+0

Thanks.I想通了,最終我可以使用,而不是試圖流行元素的索引。但是,我不知道$ {!array *}和((cnt ++))構造。 – MasterF 2012-04-11 10:23:50