Variablen Arraynamen vergeben

D

Descartes

Jungspund
Hallo,

ich suche nach einer Lösung einen Array in mehrere Kleine zu splitten, indem ich bestimmte Arrayelemente gruppiere.

Folgendes habe ich bisher:
PHP:
#!/bin/bash

DOMAINS=("aa.com" "aaa.com" "a.de" "b.de" "b.museum" "bb.museum" "bbb.aero" "aaa.de" "a.com" )

# Sortiere doppelte Domainnamen und leere Elemente aus
DOMAINS=($(echo ${DOMAINS[*]} | tr ' ' '\012' | sort --unique))

# Sucharray für egrep festlegen
SUCHE=("de" "com" "museum" "aero" "at" "cc")

# Durchlaufe einzelne Domainendungen und schreibe Treffer in neuen Array
# der nach der Domainendung benannt ist
for s in ${SUCHE[*]}
do

$s=($(echo ${DOMAINS[*]} | tr ' ' '\012' | egrep -o ".*\."$s))                                     

done

Das funktioniert auch, solange ich dem Array in der ersten Schleife einen festen Namen gebe. Ich möchte erreichen, dass der Array so benannt wird, wie die einzelnen Elemente im Array SUCHE. Ziel ist, dass alle .de Domains in einem Array "de", alle .com Domains im Array com landen usw.

Danke für jeden Tipp - Descartes
 
Zuletzt bearbeitet:
Hi,

ich denke du suchst eval:
Code:
eval $s=($(echo ${DOMAINS[*]} | tr ' ' '\012' | egrep -o ".*\."$s))

mfg,
bytepool
 
Hallo,

vielen Dank!

Direkt funktioniert es so nicht, aber ich habe ein wenig ausprobiert und folgendes funktioniert:

PHP:
for s in ${SUCHE[*]}
do

#eval $s=($(echo ${DOMAINS[*]} | tr ' ' '\012' | egrep -o ".*\."$s))

a=$s
b="=($(echo ${DOMAINS[*]} | tr ' ' '\012' | egrep -o ".*\."$s))"

eval $a$b

c='echo ${'
ccnt='echo ${#'
d='[*]}'

eval $c$s$d
eval $ccnt$s$d

done

Es liegt vermutlich am zweiten Teil ($b), dass es nicht direkt in einer Zeile geht. Hier scheinen die Sonderzeichen $ und/oder \ irgendwie Probleme zu bereiten.

Weiß jemand warum und welche Zeichen hier wie escaped werden müssen?

Auch http://www.netzmafia.de/skripten/unix/unix8.html hat mich da nicht weitergebracht ...

Grüße

Martin
 
Hi,

die Klammern fuer den Array muessen noch escaped werden:

Code:
eval $s=\( $(echo ${DOMAINS[*]} | tr ' ' '\012' | egrep -o ".*\."$s) \)
Das habe ich jetzt zugegebenermassen aber auch mehr durch rumprobieren rausgefunden. ;)

Ich denke der Grund ist, dass die Klammern von der bash ausgewertet werden, bevor ueberhaupt das eval built-in aufgerufen wird. D.h. die Klammern muessen escaped werden, damit sie korrekt an eval uebergeben werden. Das ist jedenfalls meine Vermutung.

Edit:
Mhh, ja, eigentlich logisch wenn man mal drueber nachdenkt. Die komplette Zeile wird ja abgearbeitet bevor sie an eval uebergeben wird, d.h. die Abarbeitung der Zeile ist zweischrittig, und die Klammern gehoeren zum zweiten Schritt... Also muessen sie escaped werden, damit sie beim ersten Durchgang nicht schon zu Syntax Fehlern fuehren.

mfg,
bytepool
 
Zuletzt bearbeitet:
Hallo

und nochmals vielen Dank! Jetzt funktioniert es prima :))
Noch als kleiner Nachtrag: Das Escapen gilt auch für geschweifte Klammern (gleiche Erklärung), so dass in der Schleife

PHP:
c='echo ${'
ccnt='echo ${#'
d='[*]}'

eval $c$s$d
eval $ccnt$s$d

ganz einfach als

Code:
eval echo $\{$s[*]\}
eval echo $\{#$s[*]\}

in einer Zeile geschrieben werden kann.

Grüße

Martin
 
Zurück
Oben