Problem mit Anführungszeichen

C

chakaa

Grünschnabel
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 -h """$HOST""" -u """$username""" -p """$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 -h """$HOST""" -u """$username""" -p """$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:
 
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
 
Hae? Wieso schreibst du denn ueberall auch 3 Anfuehrungszeichen? Einmal Anfuehrungszeichen drum, und gut is...

..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' '' '' ''
Error: One 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; i <= NF; i++) {
	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:$9 | 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:
 
Zuletzt bearbeitet:
Hi,

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

In irgendeinem Teststadium ging es halt nur mit 3 Anführungszeichen.
Das halte ich fuer einen Trugschluss deinerseits, denn """foo"""" ist das selbe wie "foo", leere Anfuehrungszeichen werden von der Bash ignoriert.

PHP:
+ /usr/bin/vmrun -T server -h https://localhost:8333/sdk -u user -p 'password' start '[standard] test1/win98.vmx' '' '' ''
Error: One of the parameters was invalid

(der Error kommt von vmrun)
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.

mit
PHP:
cmdline=$(echo $1:$2:$3:$4:$5:$6:$7:$8:$9 | 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" '
Natuerlich, ist ja auch eine Zuweisung, was wuerdest du stattdessen erwarten?

Wenn ich jetzt noch schaffe, $cmdline wieder in einzelne Parameter zu splitten, wäre es geschafft.
Du willst jetzt einfach nur $cmdline nochmal in einzelne Variablen aufsplitten, oder wie? Das geht z.B. mit 'cut -d" " -f1' oder mit read.

werden mir nach der ersten Methode die korrekten (2) Parameter angezeigt.
In der Schleife wird offenbar das "b 2" in zwei Parameter aufgesplittet!
[...]
Ein Bug in bash?
Oder kann da jemand eine Logik erkennen? ?(
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
 
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 -h "$HOST" -u "$username" -p "$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:
 

Ähnliche Themen

Dovecot: Geteilte Postfächer (Shared Mailboxes) funktionieren nicht

script sshpass

Verschlüsseltes Backup-Script mit rsync

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Samba-Server mit Univention Corporate Server

Zurück
Oben