Shellskript Befehlszeile wiederverwenden
Hai, ich möchte eine Teil der Aufrufzeile meines ShellSkriptes im Skript nochmal verwenden. Das Problem dabei sind die Platzhalter die ja von der Shell bereits expandiert werden. Beispiel Aufruf: ./myscript -i "*.txt" Wie schaff ich es diesen Aufruf im Skript selbst wiederzuverwenden? Es soll dabei der * im Skript wiederauftauchen also: "*.txt" und nicht die expandierten Dateien. Ob ich den gesamten Aufruf bekomme oder nur den Dateifilter ist mir wurscht, das schneid ich mir dann schon zurecht. Gibts da 'ne spezielle Variable oder irgendeinen anderen Trick? $* und ähnlches geht ja nicht, da hier der Platzhalter bereits expandiert ist. Mit bestem Gruße Thomas -- Hexen stehen immer zwischen Birken Hildegunst von Mythenmetz
Thomas Stark wrote:
Hai,
ich möchte eine Teil der Aufrufzeile meines ShellSkriptes im Skript nochmal verwenden. Das Problem dabei sind die Platzhalter die ja von der Shell bereits expandiert werden. Beispiel Aufruf:
./myscript -i "*.txt"
Wie schaff ich es diesen Aufruf im Skript selbst wiederzuverwenden? Es soll dabei der * im Skript wiederauftauchen also: "*.txt" und nicht die expandierten Dateien. Ob ich den gesamten Aufruf bekomme oder nur den Dateifilter ist mir wurscht, das schneid ich mir dann schon zurecht. Gibts da 'ne spezielle Variable oder irgendeinen anderen Trick? $* und ähnlches geht ja nicht, da hier der Platzhalter bereits expandiert ist.
./myscript -i "\*.txt" Sandy -- Antworten bitte nur in die Mailingliste! PMs bitte an: news-reply2 (@) japantest (.) homelinux (.) com
Sandy Drobic schrieb:
./myscript -i "\*.txt"
Sandy
Okay ich stell mich jetzt in die Ecke, respektive geh ins Bett... Trotzdem nochmal nachgefragt: Bei dieser Lösung muß nun jeder verwendete Platzhalter escaped werden: * ? und []. Ne Variable die den Aufruf spechert gibt's nicht zufällig? In die History wandert der Aufruf ja auch mit Platzhaltern; der muß ja irgendwo zwischgespeichert sein. Aus der History selbst krieg ich den Aufruf zur Laufzeit des Skriptes ja noch nicht. Auf jeden Fall herzlichen Dank, deine Lösung hilft mir schon viel weiter. Thomas
Hallo, Am Sun, 26 Mar 2006, Thomas Stark schrieb:
Sandy Drobic schrieb:
./myscript -i "\*.txt"
Sandy
Okay ich stell mich jetzt in die Ecke, respektive geh ins Bett... Trotzdem nochmal nachgefragt: Bei dieser Lösung muß nun jeder verwendete Platzhalter escaped werden: * ? und []. Ne Variable die den Aufruf spechert gibt's nicht zufällig?
Doch. u.a. $*. Dazu muessen Wildcards im Aufruf gequoted werden, so wie du's gemacht hast. Du musst dann aber auch im script die Variable bei der Verwendung quoten. Uebrigens willst du meistens $@ statt $* verwenden. Also: ==== #!/bin/sh echo "$@" ## ohne Expansion von wildcards, ## aequivalent zu: echo "$1" "$2" echo $@ ## mit Expansion von wildcards, ## aequivalent zu: echo $1 $2 for i; do echo "$i" ## keine Exp. von wildcards echo $i ## mit Exp. von wildcards done ==== Solltest du in einem Verzeichnis testen, wo nur zwei Datein liegen auf die das Muster passt. Und in $0 (nicht in $@) findet sich der Name des scripts. -dnh -- Bei den meisten Männern reicht es nicht zum Begreifen, nur zum Begrabbeln. -- Gabriele Conrad
David Haller schrieb:
Am Sun, 26 Mar 2006, Thomas Stark schrieb:
Sandy Drobic schrieb:
./myscript -i "\*.txt"
Sandy Bei dieser Lösung muß nun jeder verwendete Platzhalter escaped werden: * ? und []. Ne Variable die den Aufruf spechert gibt's nicht zufällig?
Doch. u.a. $*. Dazu muessen Wildcards im Aufruf gequoted werden, so wie du's gemacht hast. Du musst dann aber auch im script die Variable bei der Verwendung quoten. Uebrigens willst du meistens $@ statt $* verwenden. Also:
==== #!/bin/sh echo "$@" ## ohne Expansion von wildcards, ## aequivalent zu: echo "$1" "$2" echo $@ ## mit Expansion von wildcards, ## aequivalent zu: echo $1 $2 for i; do echo "$i" ## keine Exp. von wildcards echo $i ## mit Exp. von wildcards done ====
So einfach kann die Welt sein :-). Mein Dank wird dir ewig nachschleichen. Was ich jetzt noch nicht kapiert hab ist der Unterschied zwischen $* und $@? Viele Grüße Thomas
Hallo, Am Sun, 26 Mar 2006, Thomas Stark schrieb:
So einfach kann die Welt sein :-). Mein Dank wird dir ewig nachschleichen.
*grins*
Was ich jetzt noch nicht kapiert hab ist der Unterschied zwischen $* und $@?
Les die Doku in 'man bash'. Und dann probiere es aus: ## Parameter setzen: set -- a b 'c d' 'e f'; ## ^^ ^^ die sind jew. 1 tab echo '=== for i:'; for i; do echo "»$i«"; done; ## nimmt "$@" echo '=== for i in $*:'; for i in $*; do echo "»$i«"; done; echo '=== for i in "$*":'; for i in "$*"; do echo "»$i«"; done; echo '=== for i in $@:'; for i in $@; do echo "»$i«"; done; echo '=== for i in "$@":'; for i in "$@"; do echo "»$i«"; done; Und lese nochmal / parallel die Doku. Dann sollte es klar werden ;) Und versuch das Ergebnis zu erklaeren. HTH, -dnh -- 93: Emacs Warum werden die Funktionen nicht mit Passwörtern versehen? (Frank Klemm)
Jawohl Herr Lehrer, ich werde mich bemühen die Aufgabe zu Ihrer Zufriedenheit zu lösen:-) Dank für Deine Mühen, ich seh mir das heut Nacht genauer an. Thomas
participants (3)
-
David Haller
-
Sandy Drobic
-
Thomas Stark