0

複数のキューからの 1 つの要素をそれぞれ含むいくつかのセットを構築する必要がある bash スクリプトがあります (配列を使用してこれらを格納することを検討しています)。たとえば、次のキューがある場合:

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

次の配列を取得する必要があります (一度にすべてを取得する必要はありません。結果の配列を 1 つずつ処理します)。

斧1
2によって
cz 3
e 4
へ

配列の数は動的です。

したがって、基本的には、各配列から最初の要素をポップして、別の配列に入れる必要があります。次のように、配列から最初の要素をポップできることを知っています。

 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
4

1 に答える 1

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      
于 2012-04-11T10:06:36.960 に答える