2012-04-11 12 views
0

複数のキューから1つの要素を含むいくつかのセットをビルドする必要がある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

関連する問題