[SOLVED] S: Hilfe bash-Variablenersetzungsverhinderung

  • Yohoo!


    (Für das Topic kriege ich bestimmt den "Blödestes-Wort-des-Jahres-Preis" :lol2


    Ich habe einen String mit Shell-Wildcards (also "*") und Leerzeichen. Beispiel:

    Code
    a="/proc/* /srv/*"


    Jetzt will ich die einzelnen Verzeichnisse auswerten (Anm: Die Verzeichnissnamen enthalten keine Leerzeichen!):

    Code
    for i in `echo "$a"`; do echo "$i"; done


    Blöderweise ersetzt er mir die "*" dann immer durch die vorhandenen Dateien :motz1


    Ihr könnt das einfach nachvollziehen:

    Code
    a="/proc/* /test/*"
    echo "$a"
    echo $a
    for i in `echo "$a"`; do echo -n "$i"; echo -n "      "; echo $i;  done


    Das Problem liegt in der Zeile "for i in ..."
    Jemand eine möglichst einfache Idee?

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

    Einmal editiert, zuletzt von knebb ()

  • Zitat

    Original von Wicky
    knebb
    ...ich habe dich noch nicht recht verstanden.


    Ehm, tja, also .... ;D


    Zitat

    Aber vermutlich musst du das * Zeichen schützen. Das erreichst du durch ein vorangestelltes \. Also \*


    Nope. Den Trick kenne ich durchaus ;)
    Probier's aus:

    Code
    a="/proc/\* /test/\*"
    echo "$a"
    echo $a
    for i in `echo "$a"`; do echo -n "$i"; echo -n "      "; echo $i;  done

    Ergibt:

    Code
    /proc/\* /proc/\*
    /tesat/\* /test/\*

    Satz mit X. :(


    Nochmal:
    Ich will mit jedem einzelnen Eintrag in der Ursprungsvariable (a) etwas innerhalb meiner for-Schleife machen. Dazu brauche ich die Einträge aber halt genau so, wie sie in a ursprünglich drinnen sind, ohne Shell-Ersetzung.

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Hi Knebb,


    So ganz klar was Du willst ist mir nicht...
    In i soll der Stern unerstetzt bleiben, aber in der Schleife dann ausgewertet werden?
    Vielleicht mit eval, also erst den Stern escapen und dann 'ne neue Variable definieren:

    Code
    a="/proc/\* /sys/\*"
    for i in $a; do 
        eval "x=$(echo $a)"
       for dir in $x; do.
          .....
       done
    done


    Pit

    VDR2: ASRock J4105-ITX, DVBSky S952, openSUSE Tumbleweed, VDR 2.4.7

    softhddevice/vaapidevice, DFAtmo, xmltv2vdr, tvscraper, tvguideng, VDRAdmin-AM (alles git, aber alt)

  • Nochmal wenn ich es nach 100mal lesen richtig verstehe möchtest du das
    a="Der Inhalt von /proc"
    ist?
    Probier das doch mal

    Code
    a=`/bin/ls /proc`
    #echo "$a"
    #echo $a
    for i in `echo $a` ; do echo -n "$i"; echo -n "      "; echo $i;  done

    Gruß Tom


    99% der ComputerFehler sitzen zwischen Tastatur und Rückenlehne :schiel

  • Zitat

    Original von tr500
    Nochmal wenn ich es nach 100mal lesen richtig verstehe möchtest du


    Oh weia, kann ich das wirklich so schlecht rüberbringen? :rolleyes Also nochmal, etwas anders:


    Ich habe eine Variable (genauer wohl: ein Array), dessen einzelne Elemente durch Leerzeichen getrennt sind.
    Ich will jetzt einfach mit den einzelnen Elementen "etwas" machen (z.B. mittels echo ausgeben, ein anderes Skript aufrufen etc.).
    Also eigentlich ganz einfach:

    Code
    a="E1 E2 E2"
    for i in $a; do
         echo $i
    done

    Ergibt:

    Code
    E1
    E2
    E3

    Soweit klar (?) ;D


    Das Perfide an der Sache ist jedoch, daß die einzelnen Elemente auch den Shell-Wildcard "*" enthalten können. D.h. bei

    Code
    a="E1 /home/* E3"

    soll eben das rauskommen:

    Code
    E1
    /home/*
    E3

    Mit dem obigen Skript kommt aber das hier raus:

    Code
    E1 
    /home/user1
    /home/user2
    E3

    :motz2


    Nehme ich "die üblichen Verdächtigen":

    Da kann ich aber in der Ausgabe weder den Backslash noch die einfachn Anführungszeichen nicht brauchen...und auch nicht nur eine Zeile/ Variable, die hatte ich vorher auch...

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Hi,


    Zitat

    set
    -f noglob Deaktiviert die Komplettierungsfunktion für Dateinamen


    also:

  • Zitat

    Original von Greywolf
    Darf "a" auch ein Array sein?


    Nein, da a eigentlich schon ein Element eines Arrays ist ;)


    Zitat
    Code
    a=("/proc/*" "/test/*")
    for i in "${a[@]}" ; do echo -n "$i"; echo -n "      "; echo $i;  done

    Hmmmm...das geht.....warum bloß?


    Ach ja, jetzt habe ich den faulen Trick gefunden: Dadurch, daß a ja schon ein Array ist, kannst Du die einzelnen Elemente schon wunderbar ansprechen. Da brauche ich das dann auch nicht aufteilen... Nenene, sooo einfach machen wir uns das nicht ;)

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

    Einmal editiert, zuletzt von knebb ()

  • egal hat die Option gefunden, die ich eben noch erfolglos gesucht habe :D


    Aber um die Komplettierung innerhalb der Schleife wieder zu aktivieren muss es dann so aussehen:


    Code
    a="/proc/* /test/*"
    set -o noglob
    for i in `echo "$a"`; do set +o noglob ; echo -n "$i"; echo -n "      "; echo $i;  done
  • Zitat

    Original von egal
    [QUOTE]set -f noglob Deaktiviert die Komplettierungsfunktion für Dateinamen


    Cool. Und "+f" schaltet sie wieder an. Wieder was gelernt.

    Funktioniert genauso, wie es soll!


    THX@all für die Mühe, mein wirres Geschreibsel zu verstehen ;)


    EOT

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!