BusyBox Array

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Generic1
Beiträge: 78
Registriert: 15.11.2012 13:41:28

BusyBox Array

Beitrag von Generic1 » 16.11.2012 12:42:10

Hi,

ich wollte mittels busybox ein Array haben in dem ich Strings speichere, hab aber gesehen, dass Busybox arrays nicht unterstützt, sondern dass man das alles mit awk machen muss.
Daher hab ich folgendes gemacht:

ich habe einen String der z.B. so aussieht:

meinString=Hallo1 Hallo2 Hallo3 Hallo4 # also 4 Strings mit whitespaces getrennt

diese 4 Strings möchte ich in einem "Array" habe wo ich jederzeit darauf zugreifen kann.
Deshalb hab ich folgendes versucht:

Code: Alles auswählen

echo ${meinString} | awk -F ' ' '{ for(i=1;i<=NF;i+=1) {pring myvar=$i} }'
Ich war der Meinung, dass ich dann über myvar auf die 4 einzelnen Strings zugreifen kann, das funktioniert aber nicht.

Könnte mir da jemand weiterhelfen?
vielen Dank!!
Generic1

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: BusyBox Array

Beitrag von Cae » 16.11.2012 13:52:28

Ist das nur ungenau geschrieben oder meintest du das wirklich ohne Anfuehrungszeichen "?

Code: Alles auswählen

$ mystr=a b c d
sh: 1: b: not found
$ mystr="a b c d"
$ echo $mystr | mawk -F\  '{for (i = 1; i <= NF; i++) print myvar = $i }'
a
b
c
d
$ echo $myvar

$ 
Es passiert das, was man erwarten wuerde, fuer jedes Feld wird eine awk-interne Variable myvar auf den Feldinhalt gesetzt und das Ergebnis dieses Ausdrucks geschrieben. Letzteres ist identisch mit $i, und da myvar nicht verwendet wird (es ist eben nur *innerhalb* vom awk eine Variable), ist die Zuweisung sinnfrei.

Du kannst natuerlich ein "Array" mit Leerzeichen getrennt oder als CSV in einer Shell-Variablen speichern, die immer an awk gepipet wird und im selben Format wieder raus kommt. Dann machst du irgendwelche Berechnungen mit awk und den Rest in der sh. Vermutlich ist stattdessen eine Implementation komplett in awk sinnvoll. Das ist aber auch wieder vom Anwendungsfall abhaengig, am Besten sagst du einfach, was du am Ende haben willst.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: BusyBox Array

Beitrag von newdeb » 16.11.2012 17:20:53

1.) awk - Ausgabe anpassen, so dass Variablenzuweisungen für die Shell herauskommen:

Code: Alles auswählen

$ mystr="Hallo1 Hallo2 Hallo3 Hallo4"
$ echo "$mystr"|awk '{for (i=1;i<=NF;i++) print "myvar"i "=" $i}'
myvar1=Hallo1
myvar2=Hallo2
myvar3=Hallo3
myvar4=Hallo4
2.) eval sorgt dafür, dass diese Zuweisungen ausgeführt und die Variablen in der Shell bekannt werden:

Code: Alles auswählen

$ eval $(echo "$mystr"|awk '{for (i=1;i<=NF;i++) print "myvar"i "=" $i}')
$ echo "1:$myvar1  2:$myvar2  3:$myvar3  4:$myvar4"
1:Hallo1  2:Hallo2  3:Hallo3  4:Hallo4
Btw, mit set geht es einfacher:

Code: Alles auswählen

~ $ set -- $mystr
~ $ echo $1 $2 $3 $4
Hallo1 Hallo2 Hallo3 Hallo4

Generic1
Beiträge: 78
Registriert: 15.11.2012 13:41:28

Re: BusyBox Array

Beitrag von Generic1 » 20.11.2012 13:43:17

Vielen Dank, damit ist mir schon sehr geholfen!!!
Ein Problem hab ich jetzt noch, wie weiß ich, wieviel Variablen ich habe, gibts da eine Möglichkeit, dass ich abfrage ob es z.B. myvar5 noch gibt bzw. muss ich das über die Länge des Strings machen, so in der Art:

if(myvar5.length > 0)

oder so ähnlich.
Vielen Dank nochmal.
lg
Generic1

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: BusyBox Array

Beitrag von newdeb » 20.11.2012 16:35:18

Code: Alles auswählen

[ -n "$myvar5" ]    # Test Stringlänge >0
[ -z "$myvar5" ]    # Test Stringlänge =0

Generic1
Beiträge: 78
Registriert: 15.11.2012 13:41:28

Re: BusyBox Array

Beitrag von Generic1 » 21.11.2012 15:48:23

Besten Dank,
Ich hab das jetzt bei mir so eingebaut:

Code: Alles auswählen

if [ -n ${myVar1} ] ; then
  #machwas
fi
if [ -n ${myVar2} ] ; then
  #machwas
fi
if [ -n ${myVar3} ] ; then
  #machwas
fi
...
Ich weiß jetzt nicht genau, wieviel variablen es gibt (sind immer so zwischen 1 und 10)
Weiß jemand wie ich das eleganter lösen kann, statt die ganzen 10 if- Abfragen reinzukopieren?

Vielen dank.
Generic1

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: BusyBox Array

Beitrag von Cae » 21.11.2012 17:27:56

Code: Alles auswählen

for var in "$a" "$b" "$c"; do
	if [ -n "$var" ]; then
		# find out what $var was
	fi
done
Wenn's nicht darauf ankommt, welche Variable das nun war, kann man das verwenden. Sonst faellt mir nur eine eklige eval-Geschichte ein, oder eine Funktion (die dann mehrfach aufgerufen wird und genauso wie die Schleife oben das Problem hat, nicht an den Variablennamen dranzukommen).

Uebrigens sind die Anfuehrungszeichen " wirklich wichtig:

Code: Alles auswählen

$ a="foo bar"
$ test $a; echo $?
sh: 3: test: foo: unexpected operator
2
$ test "$a"; echo $?
0
$ test "$b"; echo $?
1
$ 
Das erste Test sieht zwei Argumente, foo und bar. Allerdings ist kein = oder ein sonstiger Parameter im Spiel, deswegen kann test damit nichts anfangen. Erst wenn die Variable in Anfuehrungszeichen steht, wird sie test als *ein* Argument uebergeben.
Hinter [ steckt das Programm test, deshalb gilt der gerade beschriebene Sachverhalt auch bei if [ ... ]; then ... fi.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten