PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : KSH - Eingabeparameter mit Anführungszeichen weiterreichen


LordZed
2010-09-13, 14:27:27
Hallo zusammen! Ich habe ein kleines Problem und hoffe auf eure Hilfe. Ich habe sinngemäß folgendes Shell-Script:

PARAMS=$*
validateAndExecute "myFunction('$PARAMS')"

Nun werden in diesen PARAMS verschiedene Minusparameter mit ihren Parametern übergeben. Teilweise (z.B. '-description') sind diese mit ganzen Sätzen füllbar. Die Parameter müssen also in Anführungszeichen stehen. Das Problem ist, dass mir an irgendeiner Stelle alle Anführungszeichen immer rausgeschmissen werden. Ich habe es schon auf verschiedene Arten versucht:


PARAMS="$*"
PARAMS=$@
PARAMS="$@"
Direktes einbetten von $* oder $@ in die 2. Zeile

Nichts davon hat bewirkt, dass die Anführungszeichen mit übergeben werden. Die werden schlichtweg immer rausgeschmissen, was dazu führt, dass die Beschreibung beispielsweise immer nur aus dem ersten Wort besteht.

Wie kriege ich das hin, dass die Anführungszeichen dort mit übergeben werden? Hoffe ihr versteht mein Problem und mir kann jemand weiterhelfen!? ;) Vielleicht hab ich ja auch einfach nur einen Denkfehler :)

Pinoccio
2010-09-13, 14:39:46
Mal mit ', also single quotes probiert?

/edit: Irgendwie steh ich auch ein wenig aufm Schlauch, was genau da pasieren soll.

mfg

LordZed
2010-09-13, 14:50:23
Also! Ich habe ein Shellscript, was - in einem weitern Script - eine Python-Funktion aufruft. Ich rufe dieses Script jetzt z.B. wie folgt auf:
meinScript.sh -name blubb -description "Hier steht meine Beschreibung" -value 10
Nun werden alle Parameter an die validateAndExecute-Funktion weitergereicht. Wenn ich dieser direkt die Werte händisch eingegeben gebe, dann klappt das auch. Das Problem ist also vorher. Wenn ich mir nun in der Python-Funktion die Parameter ausgeben lasse steht da:
-name blubb -description Hier steht meine Beschreibung -value 10
sprich bei der Beschreibung sind die Hochkommata verschwunden, was dazu führt, dass die Beschreibugn nur noch ein "Hier" ist.

Hoffe das Problem ist jetzt etwas klarer geworden.

Ich habe auch schon versucht das script so aufzurufen:
validateAndExecute 'myFunction("'$@'")'
aber das geht auch nicht ;) Mit $* ebenfalls nicht.

Pinoccio
2010-09-13, 14:58:30
Also! Ich habe ein Shellscript, was - in einem weitern Script - eine Python-Funktion aufruft. Ich rufe dieses Script jetzt z.B. wie folgt auf:
meinScript.sh -name blubb -description "Hier steht meine Beschreibung" -value 10
Nun werden alle Parameter an die validateAndExecute-Funktion weitergereicht. Wenn ich dieser direkt die Werte händisch eingegeben gebe, dann klappt das auch. Das Problem ist also vorher. Wenn ich mir nun in der Python-Funktion die Parameter ausgeben lasse steht da:
-name blubb -description Hier steht meine Beschreibung -value 10
sprich bei der Beschreibung sind die Hochkommata verschwunden, was dazu führt, dass die Beschreibugn nur noch ein "Hier" ist.

Hoffe das Problem ist jetzt etwas klarer geworden.

Ich habe auch schon versucht das script so aufzurufen:
validateAndExecute 'myFunction("'$@'")'
aber das geht auch nicht ;) Mit $* ebenfalls nicht.Ah, verstehe.

Wie sieht es mit folgendem aus?
validateAndExecute 'myFunction('"$@"')'
(Hierbei sind um $@ die doppelten Anführungsstriche innen und die einfachen jetzt außen - entgegengesetzt zu deiner Variante)

mfg

LordZed
2010-09-13, 15:25:22
Ah, verstehe.

Wie sieht es mit folgendem aus?
validateAndExecute 'myFunction('"$@"')'(Hierbei sind um $@ die doppelten Anführungsstriche innen und die einfachen jetzt außen - entgegengesetzt zu deiner Variante)

mfg
Auch schon ausprobiert. Führt dazu, dass er der Funktion validateAndExecute mehrere Parameter übergeben will. Wenn jetzt wie im obigen Beispiel folgendes in $PARAMETER steht:
-name blubb -description "asdasdasd"
will er dann folgenden Befehl absetzen:
validateAndExecute 'myFunction(' "-name" "blubb" "-description" "asdasdasd" ')'
Sprich er erkennt die Inhalte der Variable nicht als einen String, sondern als mehrere Parameter. Ziel ist es also an und für sich folgendes:
Es gilt dafür zu sorgen, dass ich die Argumente der Funktion gesamelt in einer Variable habe inkl. deren Hochkommata. Letzteres stellt dabei aus irgendeinem Grund ein Problem dar ;)

Pinoccio
2010-09-13, 15:37:14
Aha. Du willst als eine Liste von Strings (also die Parameter deines obersten Sktipts) als ein String an die Python-Funktion übergeben? Ich vermute,das funktioniert nicht ohne weiteres.

/edit: siehe Beitrag #8
An irgendeiner Stelle müsstest du das zusammenpacken, also evtl. in einer Schleife oder so. (Wobei es imho egal ist, ob in Phyton oder im Skript, letzteres wäre da vermutlich sinvoller.)
Oder halt von Hand:

Nur so:
meinScript.sh '-name blubb -description "Hier steht meine Beschreibung" -value 10'

mfg

LordZed
2010-09-13, 15:45:55
Dein letzter Vorschlag war auch das, was ich zuerst hatte, aber ist ja nicht das, wie man üblicherweise mit Minusparametern verfährt, dass man sie erstmal alle in einfache Hochkommata setzen muss und dann innerhalb mit doppelten. Das ist von den Benutzern zuviel verlangt und nur eine weiter Fehlerquelle... ;)

Ich find es erstaunlich, dass ich nicht, wenn es schon eine Variable für "alle Parameter" gibt ($@ / $*) diese nicht so handelbar sind, dass dort enthaltene Anführungszeichen nicht einfach runterfallen ^^

Pinoccio
2010-09-13, 16:13:41
Dein letzter Vorschlag war auch das, was ich zuerst hatte, aber ist ja nicht das, wie man üblicherweise mit Minusparametern verfährt, dass man sie erstmal alle in einfache Hochkommata setzen muss und dann innerhalb mit doppelten. Das ist von den Benutzern zuviel verlangt und nur eine weiter Fehlerquelle... ;)Wohl wahr.

Andererseits stehen afaik im Paramter des Skripts schon keine Hochkommata mehr drin. Keine Chance, außer evtl. nach Leezeichen scannen (Regex dafür: \\s+) und bei vorhandensein Hochkommate wieder einfügen.
Noch ein Versuch:#!/bin/ksh
$PARAM=""
$QUOTES='"'
for FOO in $@
do
if [[ FOO has Spaces]]; # keine Ahnung, wie genau in KSH
then
BAR=$QUOTES$FOO$QUOTES
else
BAR=$FOO
if
$PARAM=$PARAM$BAR
done
validateAndExecute 'myFunction("$PARAM")'
Ich hoffe, es ist klar, was ich meine.

mfg

LordZed
2010-09-14, 09:27:09
Hi! Das nachträgliche wieder hinzufügen von Hochkommata könnte ich natürlich versuchen, will ich aber mal als letzte Alternative betrachten.

Dass in den Parametern an und für sich schon keinen Hochkommata mehr stehen ist wahr, aber dafür gibt es ja die Möglichkeiten "$@" und "$*" die im ersten Fall jeden Eingabeparameter bei dieser Ausgabe mit Hochkommata umschließen oder im zweiten Fall alle gemeinsam umschließen. Wenn ich also als Eingabeparameter die folgenden habe:
param1 param2 'param3 hier'
wird daraus:
"$@" => "param1" "param2" "param3 hier"
"$*" => "param1 param2 param3 hier"
Aber mit diesem Wissen und meiner Logik klappt es nicht ;) Ich versuch mal heute mit frischem Kopf zu schauen, ob mir was einfällt.

Pinoccio
2010-09-14, 11:04:06
Hi! Das nachträgliche wieder hinzufügen von Hochkommata könnte ich natürlich versuchen, will ich aber mal als letzte Alternative betrachten.Verständlich.

Hilft dir sicherlich nicht, aber unter Windows klappt das (soweit ich es verstanden habe) so:
# start.bat
validateAndExecute.bat mod.py %*
#validateAndExecute.bat
%*#mod.py
import sys
if (len(sys.argv) > 1):
print "Number of arguments: "+str(len(sys.argv)-1)
print "List of Arguments"
i=0
for a in sys.argv:
if (i>0):
print " "+str(i)+" : "+a
i=i+1
print "end"
else:
print "No arguments"Ergebnis:
D:\>start.bat -param1 -param2 "with quotes"
Number of arguments: 3
List of Arguments
1 : -param1
2 : -param2
3 : with quotes
end

D:\>Das Pythonskript bekommt also wie gewünscht 3 Argumente, wo bei das Argument in den Hochkommata zusammenbleibt.

Angelehnt daran wäre vielleicht auch bei dir statt validateAndExecute 'myFunction('"$@"')' sowas wie validateAndExecute myFunction $@ ein Möglichkeit.

mfg

LordZed
2010-09-14, 11:10:48
Das würde vermutlich reichen, wenn ich das Python-Script direkt aufrufe. Was bei mir ja aber geschiet ist, dass ich den Namen der Python-Funktion + Parameter, die später aufgerufen werden soll als einen String an ein Validate-Script übergebe. Es ist ja außerdem auch kein Script, was ich aufrufe, sondern eine Funktion innerhalb eines Scripts.

Ich baue mir gerade eine Funktion, die einfach um alle Parameter, die Whitespaces enthalten Anführungszeichen setzt. Ich weiß nur noch nicht, wie ich einen String auf whitespaces überprüfe, aber das kriege ich noch raus. Ich kann leider nicht alle einfach in Hochkommata setzen, da sonst die Minusparameter nicht mehr erkannt werden ;)