Problem mit Anführungszeichen

Diskutiere Problem mit Anführungszeichen im Shell-Skripte Forum im Bereich Programmieren unter Linux/Unix; Hallo, ich sitze schon wieder S-t-u-n-d-e-n an einem vermeintlich trivialen Problem. Ich habe hier ein Programm vmrun (von vmware), für das...

  1. chakaa

    chakaa Grünschnabel

    Dabei seit:
    09.11.2005
    Beiträge:
    4
    Zustimmungen:
    0
    Hallo,

    ich sitze schon wieder S-t-u-n-d-e-n an einem vermeintlich trivialen Problem.

    Ich habe hier ein Programm vmrun (von vmware), für das ich ein komfortableres Aufruf-Script schreiben will.
    Das Programm braucht - je nach Modus - zwischen 2 und 5 Parameter.
    Leider kommt es nicht damit zurecht, wenn man ihm zu viele "" Parameter übergibt X(

    Also sowas wie
    PHP:
    vmrun -T server -"""$HOST""" -"""$username""" -"""$password""" """$1""" """$2""" """$3""" """$4""" """$5"""
    führt zu einem Fehler, wenn z.B. nur 3 Parameter erwartet werden. $4 und $5 sind dann leer, und es würde "" "" übergeben. Damit kommt das dusslige Programm nicht zurecht.

    ich müsste halt Folgendes bekommen
    PHP:
    vmrun -T server -"""$HOST""" -"""$username""" -"""$password""" """$1""" """$2""" """$3"""
    Sorry für die längliche Erklärung, aber das musste sein. Vielleicht bin ich ja mit meinem Lösungsversuch grundsätzlich auf dem Holzweg, und es kann mir jemand was Einfacheres zeigen.

    Ich schaffe es nicht, """$4""" (samt Anführungszeichen) in eine Variable zu bekommen. (Die Anführungszeichen sind nötig wegen Leerzeichen usw.)
    Die Variable (ich nenne sie mal $p4) hätte dann also entweder den Inhalt "+Argument4+", oder sie wäre halt leer.

    (Testen kann man das übrigens, indem man vor die Zeile ein echo schreibt, und das Script mit bash -x aufruft. Bash zeigt dann 'einfache' Anführungszeichen an. Und die müssen bei leeren Parametern weg ;-)

    Fällt jemandem irgendeine Möglichkeit ein, die Aufrufzeile zusammenzubasteln? :hilfe2:
     
  2. Anzeige

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

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hae? Wieso schreibst du denn ueberall auch 3 Anfuehrungszeichen? Einmal Anfuehrungszeichen drum, und gut is...
    Wenn du die mit an das Programm uebergeben willst, muessen sie entsprechend gequotet werden (\").

    mfg,
    bytepool
     
  4. #3 chakaa, 18.10.2009
    Zuletzt bearbeitet: 18.10.2009
    chakaa

    chakaa Grünschnabel

    Dabei seit:
    09.11.2005
    Beiträge:
    4
    Zustimmungen:
    0
    ..sollte man denken.
    Naja, ist auch so :D
    In irgendeinem Teststadium ging es halt nur mit 3 Anführungszeichen. Aber ich gebe zu: im Moment spielt es keine Rolle mehr. Mit einem oder mit drei kommt immer das selbe Ergebnis. Daran liegt es also nicht.

    Ausgabe von bash -x:
    PHP:
    + /usr/bin/vmrun -T server -h https://localhost:8333/sdk -u user -p 'password' start '[standard] test1/win98.vmx' '' '' ''
    ErrorOne of the parameters was invalid
    (der Error kommt von vmrun)

    Im Moment bin ich einen Schritt weiter. Ich erzeuge die Kommandozeile mit awk.

    PHP:
    #!/bin/awk

    # ************************************************
    function CheckEmpty(param) {
        if (
    param == "") { return ""; } else { return "\"" param "\"" }
        return 
    param
    }

    # ************************************************
    BEGIN {
        
    FS=":"    # Trenner
        
    DEBUG=0

        
    if (DEBUG) { 
            print 
    "------------------------------------------ DEBUG"
            
    print "FS="FS" NF="NF" FNR="FNR
        
    }
    }


    {    
    # ********** MAIN LOOP ***********

    # $0 ist Gesamt-Parameter $1:$2:..
    for (i=1<= NFi++) {
        
    p[i]=CheckEmpty($i)
        
    printf "%s "p[i]
    }
    print 
    ""
    # print "\n---------------------"
    # print "1=" p[1] "\t2=" p[2] "\t3=" p[3]
    }    # EOF
    mit
    PHP:
    cmdline=$(echo $1:$2:$3:$4:$5:$6:$7:$8:$awk -f test.awk)
    kommt die korrekte Kommandozeile zurück (ohne die leeren Parameter)

    Aber jetzt kommt wieder bash ins Spiel X(

    Für bash ist der Output ein einziger String. bash -x zeigt an:
    + cmdline='"stop" "[standard] test1/win98.vmx" '
    (ich habe die einfachen AnfZ rot markiert)

    Wenn ich das jetzt an vmrun übergebe, meckert der
    Error: Unrecognized command: "stop" "[standard] test1/win98.vmx"​
    diesmal vermutlich zurecht :))

    Wenn ich jetzt noch schaffe, $cmdline wieder in einzelne Parameter zu splitten, wäre es geschafft.

    Klar kommt mir das Ganze extrem umständlich vor. Wenn es einfacher geht, schmeiße ich den ganzen Dreck gerne auf den Müll :D
    .
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    ..schon wieder was zum Haare-Ausraufen X(

    Folgendes Script

    PHP:
    #!/bin/bash

    echo "1=<$1>"
    echo "2=<$2>"
    echo "3=<$3>"
    echo "Abfrage in Schleife:"

    i=1
    for arg in $@
    do
        echo  
    "$i=<$arg>"
        
    let i+=1
    done
    echo "-------------------------------------------"
    Wenn ich das beispielsweise aufrufe mit
    test.sh a "b 2"​

    werden mir nach der ersten Methode die korrekten (2) Parameter angezeigt.
    In der Schleife wird offenbar das "b 2" in zwei Parameter aufgesplittet!

    Code:
    1=<a>
    2=<b 2>
    3=<>
    Abfrage in Schleife:
    1=<a>
    2=<b>
    3=<2>
    
    Ein Bug in bash?
    Oder kann da jemand eine Logik erkennen? ?(
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Anmerkung für den Moderator: die "automatische Beitragszusammenführung" finde ich doof. :dagegen:
     
  5. Gast1

    Gast1 Guest

    Nicht "doofer" als User, die den "Edit"knopf nicht finden.
     
  6. #5 bytepool, 18.10.2009
    bytepool

    bytepool Code Monkey

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

    ich verstehe ehrlich gesagt immer noch nicht wo eigentlich dein Problem ist, aber ich kenne auch vmrun nicht.

    Das halte ich fuer einen Trugschluss deinerseits, denn """foo"""" ist das selbe wie "foo", leere Anfuehrungszeichen werden von der Bash ignoriert.

    Jo, und da liegt irgendwie der Knackpunkt, weisst du warum sich vmrun beschwert? Ich nicht, aber das hat ja nix mit der Bash zu tun.

    Natuerlich, ist ja auch eine Zuweisung, was wuerdest du stattdessen erwarten?

    Du willst jetzt einfach nur $cmdline nochmal in einzelne Variablen aufsplitten, oder wie? Das geht z.B. mit 'cut -d" " -f1' oder mit read.

    Das ist kein Bug, sondern das erwartete Verhalten. Hab grad keine Zeit da weiter drauf einzugehen, aber das laesst sich mit while read Konstruktionen vermeiden, einfach die Board Suche verwenden.

    mfg,
    bytepool
     
  7. chakaa

    chakaa Grünschnabel

    Dabei seit:
    09.11.2005
    Beiträge:
    4
    Zustimmungen:
    0
    Hallo bytepool,

    vielen Dank, dass du auf das Problem eingegangen bist.

    Ich habe jetzt eine wirklich triviale Lösung für das triviale Problem gefunden.
    Ich schäme mich ja fast dafür, es nicht gleich so probiert zu haben, aber manchmal verrennt man sich halt :dreht:

    Und zwar geht es einfach, indem man "$@" verwendet.
    Hier das simple Script (wrapper für vmrun / vmware Server 2)

    PHP:
    #!/bin/bash
    # vmrun wrapper

    # read username=... password=...
    source ~/.auth/vmware-auth

    CMD
    =/usr/bin/vmrun
    VM_TYPE
    =server
    HOST
    ="https://localhost:8333/sdk"

    $CMD -T $VM_TYPE -"$HOST-"$username-"$password" "$@"

    exitcode=$?
    if [ 
    $exitcode -ne 0 ]; then
        
    echo "** ERROR ** (" $exitcode ")"
        
    echo press a key..
        
    read
        $CMD 
    less
    fi
    Naja, dann muss ich das wohl wieder unter "eine Erfahrung mehr" verbuchen und mich nicht über die verlorene Zeit ärgern.

    Hab mal wieder gemerkt: Bash-Programmierung ist wie ein Tanz mit einer Waschmaschine. Es geht, aber es ist ziemlich schwer :D

    Absolut unklar ist mir allerdings immer noch das seltsame Verhalten mit der Schleife

    PHP:
    i=1
    for arg in $@
    do
        echo  
    "$i=<$arg>"
        
    let i+=1
    done 
    abs-guide schreibt ja zu $@ "each parameter is a quoted string, that is, the parameters are passed on intact, without interpretation or expansion"

    Aber - ooops -:O da steht ja auch: "Of course, "$@" should be quoted."
    Und damit klappt es dann auch (for arg in "$@").

    Uff - woran man alles denken muss :rolleyes:
    Naja - wieder was gelernt. The hard way.:erschlag:
     
  8. Anzeige

    Vielleicht findest du in dieser Kategorie etwas passendes.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Problem mit Anführungszeichen

Die Seite wird geladen...

Problem mit Anführungszeichen - Ähnliche Themen

  1. Bootproblem

    Bootproblem: Hallo Ein PC (i686 mit Debian unstable, nox) hat Bootprobleme (will heißen ist erfolgt keine Grafikausgabe. was ich bisher gemacht habe: HDD an...
  2. Crontab und Scripts - Problem

    Crontab und Scripts - Problem: Hallo Zusammen Ich habe ein Script welches mittels Cronjob ausgeführt werden soll. Gemäss Log wird es auch ausgeführt, jedoch passiert nichts:...
  3. Problem bei der installation einer Sun Netzwerkkarte

    Problem bei der installation einer Sun Netzwerkkarte: Guten Morgen zusammen, beim installieren einer zusätzlichen Netzwerkkarte habe ich ein Problem. Die Karte wird nicht automatisch installiert. Es...
  4. Problem bei der Vergabe von Sciherheitsinformationen auf eine Freiagbe

    Problem bei der Vergabe von Sciherheitsinformationen auf eine Freiagbe: Liebe Community, zurzeit arbeite ich an eine Active Directory Domäne die mittels Samba läuft. Dazu habe ich einen AD DC auf Debian 8.7 mit Samba...
  5. Netzwerkproblem ? , wo ud wie suchen

    Netzwerkproblem ? , wo ud wie suchen: Hallo Folgende Problem: Testserver ist i686 Debian-unstable , auf dem läuft primär der apt-proxy apt-cahcer ng. Zugriff im Moment nur per ssh....