Variablen Arraynamen vergeben

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Descartes, 29.06.2009.

  1. #1 Descartes, 29.06.2009
    Zuletzt bearbeitet: 29.06.2009
    Descartes

    Descartes Jungspund

    Dabei seit:
    10.12.2006
    Beiträge:
    17
    Zustimmungen:
    0
    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 -".*\."$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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 29.06.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    ich denke du suchst eval:
    Code:
    eval $s=($(echo ${DOMAINS[*]} | tr ' ' '\012' | egrep -o ".*\."$s)) 
    
    mfg,
    bytepool
     
  4. #3 Descartes, 29.06.2009
    Descartes

    Descartes Jungspund

    Dabei seit:
    10.12.2006
    Beiträge:
    17
    Zustimmungen:
    0
    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
     
  5. #4 bytepool, 29.06.2009
    Zuletzt bearbeitet: 29.06.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    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
     
  6. #5 Descartes, 29.06.2009
    Descartes

    Descartes Jungspund

    Dabei seit:
    10.12.2006
    Beiträge:
    17
    Zustimmungen:
    0
    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
     
Thema:

Variablen Arraynamen vergeben

Die Seite wird geladen...

Variablen Arraynamen vergeben - Ähnliche Themen

  1. Linux 4.5 will UEFI-Variablen besser schützen

    Linux 4.5 will UEFI-Variablen besser schützen: Das Löschen bestimmter UEFI-Variablen kann manche Rechner nicht mehr startbar machen. Das kommende Linux 4.5 ergreift Maßnahmen dagegen, die im...
  2. Textdatei zeilenweise in durchnummerierte Variablen schreiben

    Textdatei zeilenweise in durchnummerierte Variablen schreiben: Hi Leute, ich versuche folgendes Problem zu lösen. Ich möchte eine Textdatei einlesen und den Inhalt jeder Zeile in immer eine neue Variable...
  3. mysql Select Abfrageergebnis in unterschiedlichen Variablen sichern

    mysql Select Abfrageergebnis in unterschiedlichen Variablen sichern: Hallo zusammen, es geht um folgenden Teil meiner .sh-Datei: NumberCheck=`mysql $SQL_ARGS "SELECT lkw, Firma FROM adb_group WHERE...
  4. Teil einer Variablen auslesen und in neue Variable schreiben

    Teil einer Variablen auslesen und in neue Variable schreiben: Hallo, ist für Euch bestimmt ganz einfach, aber trotz googlen komme ich nicht auf eine Lösung. In Variable x habe ich stehen: xy,ab Nun möchte...
  5. Inhalt einer Variablen aus Batch an Shellscript übergeben

    Inhalt einer Variablen aus Batch an Shellscript übergeben: Hallo, ich komme einfach nicht drauf. Wie kann ich den Wert aus einer Variablen eines Batches an mein Shellscript übergeben? So? #...