ubuntuusers.de

Bash Script: Array mit Schleife abarbeiten

Status: Ungelöst | Ubuntu-Version: Ubuntu 13.10 (Saucy Salamander)
Antworten |

kwitz

Anmeldungsdatum:
6. November 2009

Beiträge: 402

Wohnort: Fulda

Hallo!

Ich habe eine Liste wie folgt:

ID1 IPAdresse1
ID2 IPAdresse2
ID3 IPAdresse3

In einem Array sollte das meinem Wissen nach so aussehen:

array=(ID1 IPAdresse1 ID2 IPAdresse2 ID3 IPAdresse3)

In jedem Schleifendurchlauf müssten also immer zwei Werte in Zusammenhang "genutzt werden". Also Wert 1 & 2, dann Wert 3 & 4 usw.

Z.B. Wenn ping IPAdresse1 klappt, dann mache dies und das mit ID1 Wenn ping IPAdresse2 klappt, dann mache dies und das mit ID2 usw.

Im Netz habe ich gelesen, dass es für so etwas eigentlich mehrdimensionale Arrays gibt. Diese gibt es aber in der Bash nicht. Also muss man sich vermutlich etwas bauen. Kann man das mit einem Bashscript abbilden?

Danke für die Hilfe

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13166

Woher kommen die Daten und was willst Du mit ihnen machen?

Ciao

robert

kwitz

(Themenstarter)

Anmeldungsdatum:
6. November 2009

Beiträge: 402

Wohnort: Fulda

Die Daten kommen aus einer Postgres Datenbank. Also über eine SQL Abfrage in der Bash. Es soll geprüft werden, ob die Geräte erreichbar sind (über die IP und ping) und wenn ja ein bestimmter snmpget ausgeführt werden. Die NodeID aus der Datenbank benötige ich, um auf das Resultat des snmpget Ergebnis zu reagieren. Also der Weg zurück in die Datenbank.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

kwitz schrieb:

In einem Array sollte das meinem Wissen nach so aussehen:

array=(ID1 IPAdresse1 ID2 IPAdresse2 ID3 IPAdresse3)

... muss gar nicht !

Eventuell ist es sogar besser, die Pärchen jeweils in eine Variable zu stopfen:

array=("ID1 IPAdresse1" "ID2 IPAdresse2" "ID3 IPAdresse3")

... aber wie Robert schon sagt: verrat mal etwas mehr, was Du mit den Variablen machen willst. (denn man kann ja durchaus auch Pärchen von Variablen abarbeiten !)

Edit: Nach Deiner Beschreibung ist es eigentlich egal, ob Du sie pärchenweise in einer Variablen stehen hast (und dann innerhalb der Schleife trennst), oder ob Du sie einzeln in Variablen stehen hast, und die dann immer in Pärchen abarbeitest** ... reine Geschmachssache eigentlich !

LG,

track

** also sowas:

for (( i=0; i<6; i=i+2 )); do
        echo "ID: ${array[i]}  IP: ${array[i+1]}"
done

kwitz

(Themenstarter)

Anmeldungsdatum:
6. November 2009

Beiträge: 402

Wohnort: Fulda

track schrieb:

** also sowas:

for (( i=0; i<6; i=i+2 )); do
        echo "ID: ${array[i]}  IP: ${array[i+1]}"
done

Wie ist das in der For Schleife mit der Bedingung? Denn die Anzahl der Einträge in der Liste ist variabel.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

kwitz schrieb:

Wie ist das in der For Schleife mit der Bedingung? Denn die Anzahl der Einträge in der Liste ist variabel.

Na, schau doch mal im Bash-Manual ... Du kannst die Anzahl Elemente im Array abfragen:

track@lucid:~$ v=(1 2 3 4 5 6)
track@lucid:~$ echo ${#v[@]}
6 

... und dann natürlich auch in for (( ... )) einsetzen.

LG,

track

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

wenn jemand in einer Shell mit Arrays kommt, dann komme ich schnell ins Zweifeln, ob die richtigen Mittel angewandt werden*.

Evtl. ist es in deinem Fall auch so, dass die Werte in einer Datei stehen?

Für diesen Fall könnte eine Schleife mit 'read' die Wertepaare "verarbeitungsfertig" verfügbar machen:

while read id addr;
do
  echo "id=$id  addr=$addr"
done < dateiMitDenWertepaaren

* die Shell ist eben nicht als vollständige runde Programmiersprache gedacht. Wenn du Parameterlisten verwursten willst, sind ggf. andere Werkzeuge besser geeignet (z.B. awk?)

Antworten |