Discussion:
Parameter für Programmaufruf in Script dynamisch erstellen
(zu alt für eine Antwort)
Hermann Huber
2008-06-30 07:52:31 UTC
Permalink
Hallo Gruppe!

In einem Script möchte ich die Parameter für einen dortigen
Programmaufruf anhand der übergebenen Argumente dynamisch erstellen.

Dem Script kann eine beliebige Anzahl an Parametern übergeben werden.
Aus diesen Parametern sollen die Parameter für den weiteren Aufruf
erstellt werden.

Meine gewünschte Logik wäre so, dass aus dem Aufruf

script.sh arg1 arg2 arg3

innerhalb des Script der Aufruf

program -o arg1 -o arg2 -o arg3 entsteht.

(Im Grunde soll also jedem Parameter ein -o vorangestellt werden)


Derzeit habe ich mein Problem so gelöst, dass ich in einer Schleife alle
Parameter durchlaufe und aus den Parametern arg1 arg2 arg3 eine Variable
preparedargs zusammensetze, in der am Ende des Durchlaufs der String "-o
arg1 -o arg2 -o arg3" steht.

Am Schluss rufe ich dann das Programm mit dem Kommando

program $preparedargs

auf.

Leider aber werden dem Programm so nicht die 6 Parameter übergeben,
sondern nur einer, der den gesamten String enthält.

Als ob ich das Programm mit dem Kommando

program "-o arg1 -o arg2 -o arg3"

aufrufen würde.

Gibt es für mein Problem irgend eine Lösung?


Gruß
Hermann
Heike C. Zimmerer
2008-06-30 09:28:06 UTC
Permalink
Post by Hermann Huber
Derzeit habe ich mein Problem so gelöst, dass ich in einer Schleife
alle Parameter durchlaufe und aus den Parametern arg1 arg2 arg3 eine
Variable preparedargs zusammensetze, in der am Ende des Durchlaufs der
String "-o
arg1 -o arg2 -o arg3" steht.
Am Schluss rufe ich dann das Programm mit dem Kommando
program $preparedargs
auf.
Leider aber werden dem Programm so nicht die 6 Parameter übergeben,
sondern nur einer, der den gesamten String enthält.
Wenn $preparedargs wie im Aufruf oben ohne Quotes dasteht und den
genannten Inhalt hat, werden (sofern Du sonst nichts an der
Shell-Umgebung geändert hast) 6 Argumente übergeben (field splitting).

Der Fehler muss woanders liegen. Beispielsweise könnte $IFS nicht den
Standardwert haben (der Leerzeichen einschließt). Eine Variante wäre,
dass eines der Argumente Leerzeichen enthält. Dann würde aber nicht 1
Argument übergeben, sondern mehr als 6.
Hermann Huber
2008-06-30 19:32:08 UTC
Permalink
Heike C. Zimmerer wrote:

Danke mal für eure bisherigen Antworten.
Post by Heike C. Zimmerer
Wenn $preparedargs wie im Aufruf oben ohne Quotes dasteht und den
genannten Inhalt hat, werden (sofern Du sonst nichts an der
Shell-Umgebung geändert hast) 6 Argumente übergeben (field splitting).
So ist es natürlich, ich hatte die Variable testweise in Quotes gesetzt
und das dann übersehen :-)

Mein ursprünglicher Gedanke war, dass das Auflösen von Wildcards
verhindern wollte, da die Parameter Verzeichnisangaben beinhalten.

In preparedargs steht zB Folgendes:

preparedargs="-o /home/*/.mozilla"

Diese Parameter sollen erst vom aufgerufenen Programm ausgewertet
werden, nicht aber schon zuvor durch die Shell.

Der Aufruf

command $preparedargs

führt in meinem Fall dazu, dass das Wildcard-Zeichen aufgelöst wird und
im Falle von mehreren Matches sich sogar die Anzahl der Parameter erhöht
- was ich beim konkreten Anwendungsfall aber nicht gebrauchen kann.

Stelle ich die Varialbe unter Quotes mit

command "$preparedargs"

wird der gesamte String aber nur als einzelner Parameter wahrgenommen.

Gibt es eine Möglichkeit für diesen speziellen Aufruf die Auflösung der
Wildcards irgendwie zu verhindern?


Gruß
Hermann
Heike C. Zimmerer
2008-06-30 20:37:50 UTC
Permalink
Post by Hermann Huber
Der Aufruf
command $preparedargs
führt in meinem Fall dazu, dass das Wildcard-Zeichen aufgelöst wird
und im Falle von mehreren Matches sich sogar die Anzahl der Parameter
erhöht - was ich beim konkreten Anwendungsfall aber nicht gebrauchen
kann.
[..]
Gibt es eine Möglichkeit für diesen speziellen Aufruf die Auflösung
der Wildcards irgendwie zu verhindern?
Arrays dürften das Einfachste sein (wurde auch schon erwähnt):

for arg; do
args[${#args[@]}]="$arg"
done
command "${args[@}}"
Heike C. Zimmerer
2008-06-30 20:40:01 UTC
Permalink
Post by Hermann Huber
Der Aufruf
command $preparedargs
führt in meinem Fall dazu, dass das Wildcard-Zeichen aufgelöst wird
und im Falle von mehreren Matches sich sogar die Anzahl der Parameter
erhöht - was ich beim konkreten Anwendungsfall aber nicht gebrauchen
kann.
[..]
Gibt es eine Möglichkeit für diesen speziellen Aufruf die Auflösung
der Wildcards irgendwie zu verhindern?
Arrays dürften das Einfachste sein (wurde auch schon erwähnt):

for arg; do
args[${#args[@]}]="$arg"
done
command "${args[@]}"

_
(Supersedes wg. tipfeler)
Dirk Clemens
2008-06-30 14:14:04 UTC
Permalink
Post by Hermann Huber
Am Schluss rufe ich dann das Programm mit dem Kommando
program $preparedargs
Hast Du es wirklich so aufgerufen?
Ohne Quotes müsste es mehr als ein Parameter sein.


Versuche mal:

1.) Zum Aufbau der Parameter-Liste:
arg=()
while (( $# )); do
arg=("${arg[@]}" -o "$1")
shift
done

2.) Beim Aufruf:
program "${arg[@]}"

Das klappt dann auch mit dem Aufruf:
script a b "c d"

Zum Testen von Paramaterübergaben habe ich übrigens ein kleines Script
unter /usr/local/bin/argtest abgelegt:

#!/bin/bash
for ((p=0;p<=$#;p++)); do printf 'P%02u: |%s|\n' $p "${!p}"; done


Dirk
Hermann Huber
2008-06-30 20:19:54 UTC
Permalink
Jetzt habe ich mir auch das durch den Kopf gehen lassen.

Diese Variante mit dem Array gefällt mir bis jetzt am Besten - ich denke
das wird es schlussendlich werden :-)


Gruß
Hermann
Helmut Waitzmann
2008-07-02 19:52:20 UTC
Permalink
In einem Script möchte ich die Parameter für einen dortigen Programmaufruf
anhand der übergebenen Argumente dynamisch erstellen.
Dem Script kann eine beliebige Anzahl an Parametern übergeben werden. Aus
diesen Parametern sollen die Parameter für den weiteren Aufruf erstellt
werden.
Meine gewünschte Logik wäre so, dass aus dem Aufruf
script.sh arg1 arg2 arg3
innerhalb des Script der Aufruf
program -o arg1 -o arg2 -o arg3 entsteht.
(Im Grunde soll also jedem Parameter ein -o vorangestellt werden)
Derzeit habe ich mein Problem so gelöst, dass ich in einer Schleife alle
Parameter durchlaufe und aus den Parametern arg1 arg2 arg3 eine Variable
preparedargs zusammensetze, in der am Ende des Durchlaufs der String "-o
arg1 -o arg2 -o arg3" steht.
So einfach geht das nicht: Im POSIX-Shell können Variablen im
Allgemeinen nicht mehr als einen Parameter enthalten. Eine Ausnahme ist
die Variable »@«, d.h. die Variable, die die Aufrufparameter des Skripts
selbst enthält. Nutze sie:

numargs="$#"
while test "$numargs" -gt 0
do
set '' "$@" -o "$1" && shift 2
numargs="$(($numargs - 1))"
done

program "$@"
--
Wer mir E-Mail schreiben will, stelle | When writing me e-mail, please
bitte vor meine E-Mail-Adresse meinen | precede my e-mail address with
Vor- und Nachnamen, etwa so: | my full name, like
Helmut Waitzmann <***@example.net>, (Helmut Waitzmann) ***@example.net
Heike C. Zimmerer
2008-07-02 21:33:51 UTC
Permalink
Post by Helmut Waitzmann
numargs="$#"
while test "$numargs" -gt 0
do
numargs="$(($numargs - 1))"
done
<AOL-mode[1]>
Echt raffiniert.
</AOL-mode>


_
[1] Langzitat und eine kurze Bemerkung darunter

Loading...