値ありと値なしの Bash スクリプト配列

値ありと値なしの Bash スクリプト配列

変数 a 、 b 、 c がいくつかあります。

for ループですべての値を表示したいと考えました。

for i in ${!a[@]}; do
  echo "${a[$i]} ${b[$i]} ${c[$i]}"
done

変数 c の他の値は意図的に空になっているため、値は先頭にシフトされます。

mammals land elephant
reptile water pigeon
birds air

値がシフトされないように空の変数を作成するにはどうすればよいですか?

文字列が「water」に一致する場合は、a と b のみがエコーされるようにしてみました。

for i in ${!a[@]}; do
  if [ "$c" = "water"]; then
  echo "${a[$i]} ${b[$i]}"
  else
  echo "${a[$i]} ${b[$i]} ${c[$i]}"
  fi
done

答え1

このようなものをお探しですか?

a=("" b c)
b=(d "" f)
c=(g h "")

for i in ${!a[@]}; do
  printf "%s\t" "${a[$i]}" "${b[$i]}" "${c[$i]}"
  echo          
done

出力は

$ bash arr.sh 
        d       g
b               h
c       f

対角線上の「欠落」値をマークするために空の文字列を使用しました。複合割り当てでは、インデックスをスキップすることはできません。そこに何かが存在する必要があります。もちろん、代わりに を使用しa[1]=b a[2]=c、未割り当てのままにしa[0]たり、明示的に を使用することもできますunset a[0]

適切な 2 次元配列が必要な場合は、シェルではなく適切なプログラミング言語を使用することをお勧めします。回避策としては、 のようなキーを持ち2-3、2 つのインデックスを何らかの文字列で区切った連想配列を使用することが考えられます。ただし、実際に何を行うかによって異なります。

(後者のスニペットでは、$cインデックスなしで を使用しています( と同じになり、に 1 つの値しか割り当てていないにもかかわらず、${c[0]}でインデックスを使用しています)。)EMPTY

関連情報