Problem mit Anführungszeichen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von chakaa, 18.10.2009.

  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 diese Kategorie 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 HIER Antworten.
    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. Virtualboxproblem

    Virtualboxproblem: Hallo Folgnedes Problem: Ich kann ohne Probleme In Debian-Sid, 64Bit und virtualbox-dkms Unixoide installieren, wenn es sich um eine...
  2. grub-pc Probleme bei upgrade

    grub-pc Probleme bei upgrade: Hallo, ich habe beim dist-upgrade folgendes Problem: ---------- Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt. Trigger für...
  3. Problem bei apt-get upgrade (Kali 2.0)

    Problem bei apt-get upgrade (Kali 2.0): Hi, seit paar Tagen habe ich einige Probs. Dachte es sei mal an der Zeit für ein Update und nun tauchen da einige Fehler auf: Es müssen noch 0 B...
  4. Probleme mit YUM

    Probleme mit YUM: Hallo, ich habe CentOs 7 als Dualboot mit Windows 7 auf einen Dell Latitude E5510 installiert. Dies hat soweit auch alles geklappt. Leider habe...
  5. Problem mit Win-Zugriff auf SAMBA

    Problem mit Win-Zugriff auf SAMBA: Hallo rundherum, vielleicht hat jemand eine Idee... Habe jetzt schon 1 1/2 Tage damit verbraten und den Fehler nicht gefunden. Problem:...