Bash-Skript-Array mit und ohne Werte

Bash-Skript-Array mit und ohne Werte

Ich habe ein paar Variablen a, b und c.

Ich wollte alle ihre Werte in einer For-Schleife anzeigen.

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

Jetzt werden Werte nach oben verschoben, da andere Werte in der Variable c absichtlich leer sind.

mammals land elephant
reptile water pigeon
birds air

Wie erstelle ich eine leere Variable, damit die Werte nicht verschoben werden?

Ich habe versucht, Folgendes zu tun: Wenn die Zeichenfolge mit „Wasser“ übereinstimmt, werden nur a und b ausgegeben.

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

Antwort1

Suchen Sie nach so etwas?

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

Die Ausgabe ist

$ bash arr.sh 
        d       g
b               h
c       f

Ich habe leere Zeichenfolgen verwendet, um „fehlende“ Werte auf der Diagonale zu markieren. Bei der zusammengesetzten Zuweisung ist es nicht möglich, einen Index zu überspringen, da muss etwas vorhanden sein. Natürlich können Sie stattdessen auch „unassigned“ verwenden a[1]=b a[2]=cund lassen a[0]oder explizit „unassigned“ angeben unset a[0].

Wenn Sie ein richtiges zweidimensionales Array benötigen, sollten Sie eine richtige Programmiersprache und nicht die Shell verwenden ... Eine Art Workaround könnte darin bestehen, assoziative Arrays mit Schlüsseln wie zu verwenden 2-3, wobei die beiden Indizes durch eine Zeichenfolge getrennt sind. Aber es hängt davon ab, was Sie tatsächlich tun.

(In Ihrem letzten Snippet verwenden Sie $cohne Index (erhalten dasselbe wie ${c[0]}und verwenden dann einen Index auf EMPTY, obwohl Sie ihm nur einen Wert zugewiesen haben.)

verwandte Informationen