PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable als Argument an ein Programm übergeben



ContainerDriver
07-09-2004, 12:24
Hallo Leute,
ich habe ein kleines Problem. Ich will eine Variable als Argument an ein Programm übergeben.
Diese Variable enthält Strings mit Leerzeichen (also praktisch verschiedene Wörter).
Wie schaffe ich das nun, dass mehrere "Wörter" als ein Argument übergeben werden?

Hier ein kleines Beispiel:


#!/bin/sh

args="Argument eins Argument zwei Argument drei";

cmd="./test_prog ${args}";
${cmd};


So, Argument eins gehört zusammen, Argument zwei gehört zusammen, usw. Wenn ich das Programm normal starten würde, würde ich es so machen:


./test_prog "Argument eins" "Argument zwei" "Argument drei"
.

Wie bekomme ich das nun in einem Shell-Skript hin?

Gruß, Florian

fs111
07-09-2004, 12:30
Einfach die " hinzufügen und escapen, also so:



args="\"Argument eins\" \"Argument zwei\" \"Argument drei\"";


HTH

fs111

ContainerDriver
07-09-2004, 13:10
Danke, für die schnelle Antwort.
Das mit den \" habe ich mir auch gedacht, aber das geht irgendwie nicht. Das test_prog liestet die ganzen an ihn übergebenen Argument auf, und das ist die Ausgabe, wenn ich die \" einfüge:


[florian@leuchtturm:~]>>> sh test_script.sh
-->./test_prog
-->"Argument
-->eins"
-->"Argument
-->zwei"
-->"Argument
-->drei"

.
Was ist da denn faul? Ich nehme mal an, die Shell verarbeitet $args nicht, sondern kopiert es einfach nur in $cmd.

Gruß, Florian

fs111
07-09-2004, 18:33
lass mal ${} um args weg.

fs111

ContainerDriver
07-09-2004, 20:22
Hilft leider nicht :(
400 Zeilen Code in dem blöden Skript und der finale Aufruf klappt nicht...

peschmae
07-09-2004, 20:46
Funktionieren tut bei mir sowas:


#!/bin/sh

IFS="
"
args=("Argument eins" "Argument zwei" "Argument drei")

./test.sh ${args[0]} ${args[1]} ${args[2]}


Geht vermutlich auch einfacher, aber die Lust darauf das rauszufinden ist mir bei der im trüben Fischerei vergangen ;)

MfG Peschmä

ContainerDriver
07-09-2004, 20:59
Auch dir danke, aber so kann ich es leider nicht verwenden, da ich nicht weiß, wie viele Argumente es gibt. Ich benötige auf jeden Fall eine Lösung, bei der alle Argumente ("Argument eins", usw) in eine Variable geschrieben werden & die übergebe ich dann als Argument an das Programm das aufgerufen wird.

Gruß, Florian

peschmae
07-09-2004, 21:09
Das kannst du ja auch einfach sehr lang machen, oder? Oder kann das _richtig_ beliebig lang werden?

MfG Peschmä

ContainerDriver
07-09-2004, 21:29
Das kannst du ja auch einfach sehr lang machen, oder? Oder kann das _richtig_ beliebig lang werden?

MfG Peschmä
Naja, ich wollte das Skript so halten, das man das oben erweitern kann (also beliebig) ohne unten die Aufrufe zu ändern. Aber ich habe es jetzt hinbekommen!

Und zwar so: da ja die Varaible mit den Argumenten anscheinden von der Shell nicht mehr verarbeitet wird, sondern 1:1 übergeben wird, rufe ich das Kommando am Schluss so auf:


sh -c "$cmd";

. Hier dann der komplette Code vom Test-Skript:


#!/bin/sh

args="\"Argument eins\" \"Argument zwei\" \"Argument drei\"";

cmd="./test_prog $args";
sh -c "$cmd";

. Jetzt bin ich aber froh, dass es läuft! :)

Gruß, Florian

ThorstenS
12-09-2004, 15:00
Ist eval für sowas nicht da?

peschmae
12-09-2004, 17:34
Wie geht das dann mit eval?

MfG Peschmä

ThorstenS
12-09-2004, 18:36
Upsi, das war natürlich mehrdeutig, hier das Beispiel:



#!/bin/sh
args="\"Argument eins\" \"Argument zwei\" \"Argument drei\"";
eval "./test_prog $args"

Oder so:


args="-t -l -r"
eval "ls $args"